ใช้การเพิ่มประสิทธิภาพตามคำแนะนำของโปรไฟล์

ระบบบิลด์ของ Android สำหรับ Android 13 และต่ำกว่ารองรับการใช้การแนะนำโปรไฟล์ของ Clang การเพิ่มประสิทธิภาพ (PGO) ในโมดูล Android แบบเนทีฟที่มีบิลด์พิมพ์เขียว กฎ หน้านี้อธิบายเกี่ยวกับ Clang PGO เกี่ยวกับวิธีสร้างและอัปเดตอย่างต่อเนื่อง โปรไฟล์ที่ใช้สำหรับ PGO และวิธีผสานรวม PGO กับระบบบิลด์ (ด้วย Use Case)

หมายเหตุ: เอกสารนี้อธิบายถึงการใช้งาน PGO ในแพลตฟอร์ม Android หากต้องการเรียนรู้เกี่ยวกับการใช้ PGO จากแอป Android โปรดไปที่ หน้านี้

เกี่ยวกับ Clang PGO

Clang สามารถทำการเพิ่มประสิทธิภาพโปรไฟล์แนะนำได้โดยใช้ โปรไฟล์:

  • โปรไฟล์ตามการวัดคุมสร้างขึ้นจาก โปรแกรมเป้าหมายที่มีการวัดคุม โปรไฟล์เหล่านี้มีรายละเอียดและจัด โอเวอร์เฮดของรันไทม์
  • โปรไฟล์จากการสุ่มตัวอย่างโดยทั่วไปแล้วจะจัดทำโดย ตัวนับการสุ่มตัวอย่าง ทำให้มีค่าใช้จ่ายในรันไทม์ต่ำ และ ที่รวบรวมโดยไม่มีการใช้เครื่องมือหรือปรับเปลี่ยนไบนารี โฆษณาเหล่านี้ มีรายละเอียดน้อยกว่าโปรไฟล์ที่อิงตามเครื่องมือ

โปรไฟล์ทั้งหมดควรสร้างขึ้นจากภาระงานตัวแทนที่ ใช้พฤติกรรมทั่วไปของแอป แม้ว่า Clang จะรองรับทั้ง อิงตาม AST (-fprofile-instr-generate) และ LLVM IR (-fprofile-generate), Android รองรับเฉพาะ LLVM IR สำหรับ PGO ที่อิงตามการใช้เครื่องมือ

ต้องใช้แฟล็กต่อไปนี้ในการสร้างสำหรับการรวบรวมโปรไฟล์

  • -fprofile-generate สำหรับการวัดคุม IR ด้วยสิ่งนี้ แบ็กเอนด์จะใช้แนวทางแบบต้นไม้แบบครอบคลุมน้อยที่สุดเพื่อ ลดจำนวนจุดเครื่องมือและเพิ่มประสิทธิภาพตำแหน่งเพื่อ ขอบที่มีน้ำหนักน้อย (ใช้ตัวเลือกนี้สำหรับขั้นตอนการลิงก์ด้วย) แกง ไดรเวอร์ผ่านรันไทม์การทำโปรไฟล์โดยอัตโนมัติ (libclang_rt.profile-arch-android.a) ไปยัง Linker ไลบรารีนี้มีกิจวัตรในการเขียนโปรไฟล์ลงในดิสก์เมื่อโปรแกรม ออก
  • -gline-tables-onlyสำหรับการรวบรวมโปรไฟล์ที่อิงตามการสุ่มตัวอย่าง เพื่อสร้างข้อมูลการแก้ไขข้อบกพร่องน้อยที่สุด

โปรไฟล์สามารถใช้สำหรับ PGO ได้โดยใช้ -fprofile-use=pathname หรือ -fprofile-sample-use=pathname สำหรับการวัดคุม และโปรไฟล์ที่อิงตามการสุ่มตัวอย่างตามลำดับ

หมายเหตุ: เมื่อ Clang ทําการเปลี่ยนแปลงโค้ดไม่ได้ ใช้ข้อมูลโปรไฟล์ที่สร้างได้นาน คำเตือน -Wprofile-instr-out-of-date รายการ

ใช้ PGO

การใช้ PGO เกี่ยวข้องกับขั้นตอนต่อไปนี้

  1. สร้างไลบรารี/ไฟล์ปฏิบัติการที่มีการใช้เครื่องมือโดยการส่ง -fprofile-generate ไปยังคอมไพเลอร์และ Linker
  2. รวบรวมโปรไฟล์ด้วยการเรียกใช้ภาระงานตัวแทนใน ฐานสองแบบมีเครื่องวัด
  3. หลังประมวลผลโปรไฟล์โดยใช้ยูทิลิตี llvm-profdata (โปรดดูรายละเอียดที่หัวข้อการจัดการ LLVM ไฟล์โปรไฟล์)
  4. ใช้โปรไฟล์เพื่อใช้ PGO โดยส่ง -fprofile-use=<>.profdata ไปยังคอมไพเลอร์และ Linker

สำหรับ PGO ใน Android ควรเก็บรวบรวมโปรไฟล์แบบออฟไลน์และเช็คอิน ควบคู่กับโค้ดเพื่อให้มั่นใจว่าบิลด์ทำซ้ำได้ โปรไฟล์สามารถใช้เป็น โค้ดมีการพัฒนา แต่ต้องมีการสร้างโค้ดใหม่เป็นระยะๆ (หรือเมื่อใดก็ตามที่ Clang เตือน ว่าโปรไฟล์ไม่อัปเดต)

รวบรวมโปรไฟล์

Clang สามารถใช้โปรไฟล์ที่เก็บรวบรวมโดยการเรียกใช้การเปรียบเทียบโดยใช้ ไลบรารีที่สร้างโดยมีเครื่องดนตรี หรือการสุ่มตัวอย่างตัวนับฮาร์ดแวร์ ของ Google Play ปัจจุบัน 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 รายการ Flag เพิ่มเติมที่จะใช้ระหว่างบิลด์ที่มีเครื่องดนตรี

ตัวอย่างโมดูลที่มี 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 ในกรณีที่ห้องสมุด ดำเนินการโดยการเปรียบเทียบอื่น ไลบรารีดังกล่าวจะต้องได้รับการเพิ่มประสิทธิภาพโดยใช้ โปรไฟล์จากทั้ง 2 เกณฑ์เปรียบเทียบ ในกรณีนี้ 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 สำหรับ 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

    คำสั่งที่ 2 จะสร้างโมดูลที่เปิดใช้ PGO ทั้งหมดสำหรับ การสร้างโปรไฟล์

  5. เรียกใช้การเปรียบเทียบโดยใช้ dex2oat และ art_runtime เพื่อรับ:
    • ไฟล์ .profraw 3 ไฟล์จาก dex2oat (dex2oat_exe.profdata dex2oat_libart-compiler.profdata และ dexeoat_libart.profdata) ที่ระบุโดยใช้เมธอด ตามที่อธิบายไว้ในการจัดการโปรไฟล์ LLVM ไฟล์
    • art_runtime_libart.profdata รายการเดียว
  6. สร้างไฟล์ profdata ทั่วไปสำหรับไฟล์ปฏิบัติการ dex2oat และ libart-compiler.so กำลังใช้:
    llvm-profdata merge -output=dex2oat.profdata \
        dex2oat_exe.profdata dex2oat_libart-compiler.profdata
  7. รับโปรไฟล์สำหรับ libart.so โดยการรวมโปรไฟล์ จากตัวเปรียบเทียบ 2 ประเภทดังนี้
    llvm-profdata merge -output=libart.profdata \
        dex2oat_libart.profdata art_runtime_libart.profdata

    จำนวนดิบสำหรับ libart.so จาก 2 โปรไฟล์อาจเป็น แตกต่างกันเนื่องจากเกณฑ์เปรียบเทียบแตกต่างกันในด้านจำนวนกรอบการทดสอบและ ระยะเวลาในการทำงาน ในกรณีนี้ คุณใช้การรวมแบบถ่วงน้ำหนักได้

    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 สำหรับ ใช้ระหว่างการสร้าง