استخدام ميزة "التحسين الموجّه للملف الشخصي"

يتوافق نظام إصدار Android الذي يعمل بالإصدار 13 من نظام التشغيل Android والإصدارات الأقدم مع إرشادات الملف الشخصي الموجَّه إلى Clang. التحسين (PGO) على وحدات Android الأصلية التي تتضمّن إصدار مخطط القواعد. تصف هذه الصفحة Clang PGO وكيفية إنشاء وتحديث ملفات تعريف الارتباط المستخدمة لمؤسسة PGO، وكيفية دمج PGO مع نظام التصميم (مع حالة الاستخدام).

ملاحظة: يصف هذا المستند استخدام PGO في نظام Android الأساسي. للتعرف على استخدام PGO من تطبيق Android، انتقل إلى هذه الصفحة.

لمحة عن Clang PGO

يمكن لشركة Clang تنفيذ عملية التحسين التي يوجهها الملف الشخصي باستخدام نوعين من الملفات الشخصية:

  • يتم إنشاء الملفات الشخصية المستندة إلى الأدوات من قياس الأداء. تُعد هذه الملفات الشخصية مفصلة وتفرض النفقات العامة لوقت التشغيل.
  • الملفات الشخصية القائمة على أخذ العينات يتم إنشاؤها عادةً بواسطة لأخذ عينات من الأجهزة. تفرض أوقات تشغيل منخفضة، ويمكن البيانات التي يتم جمعها بدون أي قياس أو تعديل في البرنامج الثنائي. هم أقل تفصيلاً من الملفات الشخصية القائمة على الأدوات.

يجب إنشاء جميع الملفات الشخصية من عبء عمل تمثيلي السلوك النموذجي للتطبيق. بينما يدعم Clang كلاً من المستندة إلى AST (-fprofile-instr-generate) والمستندة إلى LLVM IR (-fprofile-generate)، لا يتوافق Android إلا مع LLVM IR-based لـ PGO القائم على الأدوات.

يجب استخدام العلامات التالية لإنشاء ملف من أجل جمع الملفات الشخصية:

  • -fprofile-generate للأجهزة المستنِدة إلى الأشعة تحت الحمراء مع هذا فإن الخلفية تستخدم الحد الأدنى المرجَّح لنهج شجرة الامتداد المرجَّح تقليل عدد نقاط الأدوات وتحسين موضعها حواف منخفضة (استخدم هذا الخيار لخطوة الربط أيضًا). كلانغ يجتاز برنامج التشغيل تلقائيًا بيئة تشغيل التحليل (libclang_rt.profile-arch-android.a) إلى أداة الربط. تحتوي هذه المكتبة على سلاسل إجراءات لكتابة الملفات الشخصية على القرص عند البرنامج وخروج.
  • -gline-tables-only لجمع الملفات الشخصية استنادًا إلى أخذ العينات لإنشاء الحد الأدنى من معلومات تصحيح الأخطاء.

يمكن استخدام ملف شخصي لمؤسسة PGO باستخدام -fprofile-use=pathname أو -fprofile-sample-use=pathname للاستناد إلى الأدوات والملفات الشخصية القائمة على أخذ العينات على التوالي.

ملاحظة: عند إجراء تغييرات على الرمز البرمجي، إذا تعذّر على Clang استخدام بيانات الملف الشخصي التي تنشئها تحذير واحد (-Wprofile-instr-out-of-date).

استخدام PGO

يتضمن استخدام PGO الخطوات التالية:

  1. بناء المكتبة/التنفيذ باستخدام الأدوات من خلال المرور -fprofile-generate إلى برنامج التجميع والرابط.
  2. يمكنك جمع الملفات الشخصية من خلال تشغيل عبء عمل تمثيلي على النظام الثنائي
  3. معالجة الملفات الشخصية بعد ذلك باستخدام الأداة المساعدة llvm-profdata (لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة التعامل مع النموذج اللغوي الكبير (LLVM). للملف الشخصي).
  4. استخدِم الملفات الشخصية لتطبيق PGO من خلال المرور -fprofile-use=<>.profdata للمحول البرمجي .

بالنسبة إلى PGO في Android، يجب جمع الملفات الشخصية بلا اتصال بالإنترنت وتسجيل الوصول إليها بجانب الرمز البرمجي لضمان إصدارات قابلة للتكرار يمكن استخدام الملفات الشخصية يتطور رمز المرور، ولكن يجب إعادة إنشاؤه بشكل دوري (أو عندما تحذر Clang أن الملفات الشخصية قديمة).

جمع الملفات الشخصية

بإمكان Clang استخدام الملفات الشخصية التي تم جمعها من خلال تشغيل مقاييس الأداء باستخدام إصدار مخصص للمكتبة أو عن طريق أخذ عينات من عدادات الأجهزة عند قياس الأداء. في الوقت الحالي، لا يدعم Android استخدام عيّنات النتائج. جمع الملفات الشخصية، لذا يجب عليك جمع الملفات الشخصية باستخدام أداة الإصدار:

  1. حدد معيارًا ومجموعة المكتبات التي تتم ممارستها بشكل جماعي لذلك المعيار.
  2. إضافة سمات pgo إلى مقياس الأداء والمكتبات (التفاصيل أدناه).
  3. إنشاء إصدار Android باستخدام نسخة مزوّدة بأداة من هذه المكتبات باستخدام:
    make ANDROID_PGO_INSTRUMENT=benchmark

benchmark هو عنصر نائب يحدد مجموعة من المكتبات التي تم قياسها أثناء الإنشاء. الممثل الفعلي (وربما ملف تنفيذي آخر يرتبط بمكتبة لقياس الأداء) ليست مخصصة لمؤسسات قطاع المؤسسات (PGO) ولا تقع ضمن نطاق هذا جلسة المراجعة.

  1. وميض أو مزامنة الإصدار المستخدَم على الجهاز.
  2. تشغيل مقياس الأداء لجمع الملفات الشخصية
  3. استخدِم أداة llvm-profdata (الموضّحة أدناه) لإجراء ما يلي: بعد معالجة الملفات الشخصية وتجهيزها للتحقّق منها ضمن المصدر شَجَرَة

استخدام الملفات الشخصية أثناء الإصدار

التحقق من الملفات الشخصية في toolchain/pgo-profiles على جهاز Android شَجَرَة يجب أن يتطابق الاسم مع ما هو محدّد في موقع فرعي واحد (profile_file) من السمة pgo للحساب الفرعي المكتبة. يمرر نظام التصميم ملف الملف الشخصي تلقائيًا إلى Clang عند إنشاء المكتبة. ANDROID_PGO_DISABLE_PROFILE_USE يمكن ضبط متغيّر البيئة على true على إيقاف PGO مؤقتًا وقياس مزايا أدائه

لتحديد أدلة ملفات شخصية إضافية خاصة بالمنتجات، ألحقها بـ متغير يجعل PGO_ADDITIONAL_PROFILE_DIRECTORIES في BoardConfig.mk إذا تم تحديد مسارات إضافية، ستتوفر الملفات الشخصية في تلغي هذه المسارات تلك المسارات في toolchain/pgo-profiles.

عند إنشاء صورة إصدار باستخدام هدف dist بهدف make، يكتب نظام التصميم أسماء ملفات الملفات الشخصية المفقودة. إلى $DIST_DIR/pgo_profile_file_missing.txt. يمكنك التحقّق من ذلك للتعرف على ملفات الملف الشخصي التي تم إسقاطها عن طريق الخطأ (والتي بدون تنبيه صوتي تؤدي إلى إيقاف PGO).

تفعيل PGO في ملفات Android.bp

لتفعيل PGO في ملفات Android.bp للوحدات الأصلية، ما عليك سوى لتحديد السمة pgo. يتضمّن هذا الموقع ما يلي: المواقع الفرعية:

الموقع الوصف
instrumentation الضبط على true لـ PGO باستخدام قياس حالة التطبيق الإعداد التلقائي هو false
sampling يجب الضبط على true لـ PGO باستخدام تحليل العيّنات. الإعداد التلقائي هو false
benchmarks تمثّل هذه السمة قائمة السلاسل. تم تصميم هذه الوحدة لإنشاء ملفات شخصية في حال كان هناك أي مقياس أداء. الواردة في هذه القائمة تم تحديدها في إصدار ANDROID_PGO_INSTRUMENT .
profile_file ملف الملف الشخصي (المتعلّق بـ toolchain/pgo-profile) المطلوب استخدامه مع PGO. يحذّر الإصدار من أنّ هذا الملف غير متوفّر من خلال إضافة هذا إرسال ملف إلى $DIST_DIR/pgo_profile_file_missing.txt ما لم يتم ضبط السمة enable_profile_use على false أو تم ضبط متغير إصدار ANDROID_PGO_NO_PROFILE_USE على true
enable_profile_use اضبط القيمة على false في حال عدم استخدام الملفات الشخصية أثناء يمكن استخدامها أثناء التشغيل التجريبي لتفعيل جمع الملفات الشخصية أو إيقاف PGO مؤقتًا. القيمة التلقائية هي true.
cflags قائمة العلامات الإضافية التي يمكن استخدامها أثناء إصدار أداة.

مثال على وحدة مع PGO:

cc_library {
    name: "libexample",
    srcs: [
        "src1.cpp",
        "src2.cpp",
    ],
    static: [
        "libstatic1",
        "libstatic2",
    ],
    shared: [
        "libshared1",
    ]
    pgo: {
        instrumentation: true,
        benchmarks: [
            "benchmark1",
            "benchmark2",
        ],
        profile_file: "example.profdata",
    }
}

إذا كان مقياسا الأداء benchmark1 وbenchmark2 تمرين السلوك التمثيلي للمكتبات libstatic1، libstatic2، أو libshared1، pgo الخاصة بهذه المكتبات أيضًا مقاييس الأداء. تشير رسالة الأشكال البيانية يمكن أن تتضمن وحدة defaults في Android.bp وحدة مشتركة مواصفة pgo لمجموعة من المكتبات لتجنب تكرار قواعد التصميم نفسها لعدة وحدات.

لتحديد ملفات ملف شخصي مختلفة أو إيقاف PGO بشكل انتقائي البنية، حدد profile_file، enable_profile_use، وcflags من المواقع لكل الهندسة المعمارية. مثال (مع استهداف بنية في غامق):

cc_library {
    name: "libexample",
    srcs: [
          "src1.cpp",
          "src2.cpp",
    ],
    static: [
          "libstatic1",
          "libstatic2",
    ],
    shared: [
          "libshared1",
    ],
    pgo: {
         instrumentation: true,
         benchmarks: [
              "benchmark1",
              "benchmark2",
         ],
    }

    target: {
         android_arm: {
              pgo: {
                   profile_file: "example_arm.profdata",
              }
         },
         android_arm64: {
              pgo: {
                   profile_file: "example_arm64.profdata",
              }
         }
    }
}

لحل المراجع الخاصة بمكتبة وقت تشغيل التحليل أثناء التحليل المستند إلى الأدوات، واجتياز علامة الإنشاء -fprofile-generate إلى الرابط المكتبات الثابتة التي يتم قياسها باستخدام PGO وجميع المكتبات المشتركة وأي برنامج ثنائي يعتمد بشكل مباشر على يجب أيضًا ضبط المكتبة الثابتة لـ PGO. ومع ذلك، فإن هذه العناصر المشتركة المكتبات أو الملفات التنفيذية لا تحتاج إلى استخدام ملفات PGO الشخصية، يمكن ضبط السمة enable_profile_use على false. خارج هذه القيود، يمكنك تطبيق PGO على أي مكتبة ثابتة أو مشتركة أو مكتبة أو تنفيذية.

التعامل مع ملفات الملف الشخصي على LLVM

ينتج عن تنفيذ مكتبة أدوات أو ملف قابل للتنفيذ ملف ملف شخصي. باسم default_unique_id_0.profraw في /data/local/tmp (حيث تكون unique_id التجزئة الرقمية الفريدة لهذه المكتبة). إذا كان هذا الملف موجودًا بالفعل، تدمج بيئة تشغيل إنشاء ملف التعريف الملف الشخصي الجديد مع القديم أثناء كتابة الملفات الشخصية. لاحظ أنه لا يمكن للتطبيق الوصول إلى /data/local/tmp والمطورون؛ يجب أن يستخدم في مكان ما مثل /storage/emulated/0/Android/data/packagename/files بدلاً من ذلك. لتغيير موقع ملف الملف الشخصي، يجب ضبط LLVM_PROFILE_FILE. متغير البيئة في وقت التشغيل.

llvm-profdata لتحويل ملف .profraw (وربما دمج ملفات .profraw متعددة) في .profdata الملف:

  llvm-profdata merge -output=profile.profdata <.profraw and/or .profdata files>

يمكن بعد ذلك التحقّق من المصدر "profile.profdata". شجرة لاستخدامها أثناء البناء.

إذا تم تحميل عدة برامج ثنائية/مكتبات تعمل خلال أحد المعايير، تُنشئ كل مكتبة ملف .profraw منفصلاً مع ملف بمعرّف فريد. ويمكن عادةً دمج كل هذه الملفات في ملف ملف .profdata ويُستخدَم لإصدار PGO في الحالات التي تكون فيها المكتبة معيارًا آخر، فيجب تحسين هذه المكتبة باستخدام من هذين المقياسَين. في هذه الحالة، show الخيار llvm-profdata مفيد:

  llvm-profdata merge -output=default_unique_id.profdata default_unique_id_0.profraw
llvm-profdata show -all-functions default_unique_id.profdata

لربط unique_id بمكتبات فردية، ابحث في show ناتج لكل unique_id لاسم دالة فريدة من نوعها للمكتبة.

دراسة حالة: PGO for ART

تقدّم دراسة الحالة تقنية ART كمثال واقعي. ومع ذلك، فإنه ليس وصف دقيق للمجموعة الفعلية من المكتبات التي تم تحليلها لـ ART أو وترابطهم المتبادلين

يعتمد التجميع المسبق لـ dex2oat في ART على libart-compiler.so، والذي يعتمد بدوره على libart.so يتم تنفيذ بيئة تشغيل ART بشكل أساسي في libart.so ستكون مقاييس الأداء لبرنامج التحويل البرمجي ووقت التشغيل مختلفة:

Benchmark المكتبات ذات الملفات الشخصية
dex2oat dex2oat (قابل للتنفيذ)، libart-compiler.so، libart.so
art_runtime libart.so
  1. أضِف سمة pgo التالية إلى dex2oat. libart-compiler.so:
        pgo: {
            instrumentation: true,
            benchmarks: ["dex2oat",],
            profile_file: "dex2oat.profdata",
        }
  2. أضِف سمة pgo التالية إلى libart.so:
        pgo: {
            instrumentation: true,
            benchmarks: ["art_runtime", "dex2oat",],
            profile_file: "libart.profdata",
        }
  3. إنشاء إصدارات أداة مخصّصة لـ dex2oat art_runtime مقاييس أداء باستخدام:
        make ANDROID_PGO_INSTRUMENT=dex2oat
        make ANDROID_PGO_INSTRUMENT=art_runtime
  4. بدلاً من ذلك، يمكنك إنشاء إصدار واحد بأداة واحدة يضم جميع المكتبات يتم قياسها باستخدام:

        make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime
        (or)
        make ANDROID_PGO_INSTRUMENT=ALL

    وينشئ الأمر الثاني جميع الوحدات التي تستخدم PGO لنظام التشغيل تحديد المواصفات الشخصية.

  5. تنفيذ مقاييس الأداء أثناء ممارسة التمارين الرياضية dex2oat و يجب الحصول على art_runtime من أجل:
  6. أنتج ملف ملف شخصي مشترك لملف dex2oat القابل للتنفيذ libart-compiler.so باستخدام:
    llvm-profdata merge -output=dex2oat.profdata \
        dex2oat_exe.profdata dex2oat_libart-compiler.profdata
  7. احصل على ملف libart.so الشخصي من خلال دمج الملفات الشخصية من المعيارَين:
    llvm-profdata merge -output=libart.profdata \
        dex2oat_libart.profdata art_runtime_libart.profdata

    قد تكون الأعداد الأولية لـ libart.so من الملفين الشخصيين كما يلي: حيث تختلف المعايير في عدد حالات الاختبار المدة التي يتم تشغيلها خلالها. في هذه الحالة، يمكنك استخدام عملية دمج مرجَّحة:

    llvm-profdata merge -output=libart.profdata \
        -weighted-input=2,dex2oat_libart.profdata \
        -weighted-input=1,art_runtime_libart.profdata

    يعين الأمر أعلاه ضعف الوزن للملف الشخصي من dex2oat ينبغي تحديد الوزن الفعلي استنادًا إلى النطاق. بالمعرفة أو التجارب.

  8. يُرجى التحقّق من ملفَّي الملف الشخصي dex2oat.profdata و libart.profdata إلى toolchain/pgo-profiles للحصول على استخدامها أثناء الإنشاء.