系统工程师唐
,,?
หลังจากปรับระดับการปรับปรุงคอมไพล์จาก O2 เป็น O3 แล้ว โปรแกรมกลับให้ผลลัพธ์ที่ผิดพลาด เกิดอะไรขึ้น?
资深工程师裴
,,,。
O3 จะเปิดใช้การปรับปรุงที่เข้มข้นกว่า เช่น auto-vectorization และ loop transformation ถ้าโค้ดมี undefined behavior ตัว optimizer อาจให้ผลลัพธ์ที่คาดไม่ถึงได้
系统工程师唐
?
มี undefined behavior ที่พบบ่อยและมักถูกมองข้ามอะไรบ้าง?
资深工程师裴
、、,,。
signed integer overflow การเข้าถึงเกินขอบเขต null pointer dereference และ data race คอมไพเลอร์จะสมมติว่าสิ่งเหล่านี้จะไม่เกิดขึ้นระหว่างการปรับปรุง ถ้าเกิดขึ้นพฤติกรรมจะคาดเดาไม่ได้เลย
系统工程师唐
?
จะค้นหาปัญหาโดยไม่ลดระดับการปรับปรุงได้อย่างไร?
资深工程师裴
,,,。
ใช้ AddressSanitizer ตรวจจับข้อผิดพลาดหน่วยความจำ และ UBSanitizer ตรวจจับ undefined behavior เปิดใช้เครื่องมือเหล่านี้ในช่วงพัฒนาและทดสอบ แล้วปิดในสภาพแวดล้อม production
系统工程师唐
?
Link-Time Optimization (LTO) ให้ประโยชน์อะไรบ้าง?
资深工程师裴
,、,。
LTO ให้คอมไพเลอร์วิเคราะห์ทั้งโปรแกรมข้ามหน่วยคอมไพล์ สามารถ inline ฟังก์ชันข้ามไฟล์ ลบโค้ดที่ไม่ถูกเรียกจริงๆ โดยทั่วไปสามารถเพิ่มประสิทธิภาพได้ 5-15 เปอร์เซ็นต์
系统工程师唐
?
ควรใช้ profiling และการปรับปรุงคอมไพเลอร์ร่วมกันอย่างไร?
资深工程师裴
,,。
ใช้ profiler ค้นหา hot function ก่อน แล้วดู assembly output เพื่อยืนยันว่าคอมไพเลอร์ทำการปรับปรุงที่คาดหวังหรือไม่ บางครั้งการเพิ่ม attribute hint หรือปรับโครงสร้างโค้ดก็สามารถกระตุ้นการปรับปรุงที่ดีขึ้นได้
系统工程师唐
?
Profile-Guided Optimization (PGO) เหมาะกับกรณีไหน?
资深工程师裴
,、,,,%。
เหมาะกับแอปพลิเคชันที่พฤติกรรมของ branch ในขณะ runtime มีความเสถียร เช่น ฐานข้อมูลหรือ browser engine ใช้ workload จริงเก็บข้อมูล profiling แล้วคอมไพล์ใหม่ ให้คอมไพเลอร์ปรับปรุง hot path จริงๆ ผลลัพธ์อาจเกิน 20 เปอร์เซ็นต์