ระบบบิลด์ของ 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 เกี่ยวข้องกับขั้นตอนต่อไปนี้
- สร้างไลบรารี/ไฟล์ปฏิบัติการที่มีการใช้เครื่องมือโดยการส่ง
-fprofile-generate
ไปยังคอมไพเลอร์และ Linker - รวบรวมโปรไฟล์ด้วยการเรียกใช้ภาระงานตัวแทนใน ฐานสองแบบมีเครื่องวัด
- หลังประมวลผลโปรไฟล์โดยใช้ยูทิลิตี
llvm-profdata
(โปรดดูรายละเอียดที่หัวข้อการจัดการ LLVM ไฟล์โปรไฟล์) - ใช้โปรไฟล์เพื่อใช้ PGO โดยส่ง
-fprofile-use=<>.profdata
ไปยังคอมไพเลอร์และ Linker
สำหรับ PGO ใน Android ควรเก็บรวบรวมโปรไฟล์แบบออฟไลน์และเช็คอิน ควบคู่กับโค้ดเพื่อให้มั่นใจว่าบิลด์ทำซ้ำได้ โปรไฟล์สามารถใช้เป็น โค้ดมีการพัฒนา แต่ต้องมีการสร้างโค้ดใหม่เป็นระยะๆ (หรือเมื่อใดก็ตามที่ Clang เตือน ว่าโปรไฟล์ไม่อัปเดต)
รวบรวมโปรไฟล์
Clang สามารถใช้โปรไฟล์ที่เก็บรวบรวมโดยการเรียกใช้การเปรียบเทียบโดยใช้ ไลบรารีที่สร้างโดยมีเครื่องดนตรี หรือการสุ่มตัวอย่างตัวนับฮาร์ดแวร์ ของ Google Play ปัจจุบัน Android ไม่รองรับการใช้แบบอิงตามการสุ่มตัวอย่าง การรวบรวมโปรไฟล์ ดังนั้นคุณจะต้องรวบรวมโปรไฟล์โดยใช้เครื่องมือ รูปร่าง:
- ระบุตัวเปรียบเทียบและชุดของไลบรารีที่นำมาใช้ร่วมกันโดย นั้น
- เพิ่มพร็อพเพอร์ตี้
pgo
ลงในการเปรียบเทียบและไลบรารี (รายละเอียด ที่ด้านล่าง) - สร้างบิลด์ของ Android ที่มีสำเนาแบบมีเครื่องควบคุมของไลบรารีเหล่านี้
โดยใช้:
make ANDROID_PGO_INSTRUMENT=benchmark
benchmark
คือตัวยึดตำแหน่งที่ระบุ
ไลบรารีที่มีเครื่องมือในระหว่างสร้าง ตัวแทนที่แท้จริง
(และอาจเป็นไฟล์ปฏิบัติการอื่นที่ลิงก์กับไลบรารีที่กำลัง
เปรียบเทียบ) ไม่ได้เจาะจงไปที่ PGO และอยู่นอกเหนือขอบเขตของ
เอกสาร
- แฟลชหรือซิงค์บิลด์ที่มีเครื่องดนตรีในอุปกรณ์
- เรียกใช้การเปรียบเทียบเพื่อรวบรวมโปรไฟล์
- ใช้เครื่องมือ
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
|
- เพิ่มพร็อพเพอร์ตี้
pgo
ต่อไปนี้ในdex2oat
libart-compiler.so
:pgo: { instrumentation: true, benchmarks: ["dex2oat",], profile_file: "dex2oat.profdata", }
- เพิ่มพร็อพเพอร์ตี้
pgo
ต่อไปนี้ในlibart.so
pgo: { instrumentation: true, benchmarks: ["art_runtime", "dex2oat",], profile_file: "libart.profdata", }
- สร้างบิลด์ที่มีเครื่องดนตรีสำหรับ
dex2oat
และ การเปรียบเทียบart_runtime
รายการโดยใช้:make ANDROID_PGO_INSTRUMENT=dex2oat make ANDROID_PGO_INSTRUMENT=art_runtime
- เรียกใช้การเปรียบเทียบโดยใช้
dex2oat
และart_runtime
เพื่อรับ:- ไฟล์
.profraw
3 ไฟล์จากdex2oat
(dex2oat_exe.profdata
dex2oat_libart-compiler.profdata
และdexeoat_libart.profdata
) ที่ระบุโดยใช้เมธอด ตามที่อธิบายไว้ในการจัดการโปรไฟล์ LLVM ไฟล์ art_runtime_libart.profdata
รายการเดียว
- ไฟล์
- สร้างไฟล์ profdata ทั่วไปสำหรับไฟล์ปฏิบัติการ
dex2oat
และlibart-compiler.so
กำลังใช้:llvm-profdata merge -output=dex2oat.profdata \ dex2oat_exe.profdata dex2oat_libart-compiler.profdata
- รับโปรไฟล์สำหรับ
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
น้ำหนักจริงควรกำหนดตามโดเมน ความรู้หรือการทดลอง - ตรวจสอบไฟล์โปรไฟล์
dex2oat.profdata
และlibart.profdata
เป็นtoolchain/pgo-profiles
สำหรับ ใช้ระหว่างการสร้าง
หรือสร้างบิลด์ที่มีเครื่องดนตรีชิ้นเดียวซึ่งมีไลบรารีทั้งหมด ใช้
make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime (or) make ANDROID_PGO_INSTRUMENT=ALL
คำสั่งที่ 2 จะสร้างโมดูลที่เปิดใช้ PGO ทั้งหมดสำหรับ การสร้างโปรไฟล์