ฉันพยายามขัดหน้า GCC man สำหรับสิ่งนี้ แต่ก็ยังไม่ได้รับจริงๆ
อะไรคือความแตกต่างระหว่าง-march
และ-mtune
?
เมื่อใดที่ใช้เพียงแค่-march
เทียบกับทั้งสองอย่าง เป็นไปได้ไหมที่จะเพียง-mtune
?
ฉันพยายามขัดหน้า GCC man สำหรับสิ่งนี้ แต่ก็ยังไม่ได้รับจริงๆ
อะไรคือความแตกต่างระหว่าง-march
และ-mtune
?
เมื่อใดที่ใช้เพียงแค่-march
เทียบกับทั้งสองอย่าง เป็นไปได้ไหมที่จะเพียง-mtune
?
คำตอบ:
หากคุณใช้-march
GCC จะมีอิสระในการสร้างคำสั่งที่ทำงานบน CPU ที่ระบุ แต่ (โดยทั่วไป) จะไม่ใช้กับ CPU รุ่นก่อนหน้าในตระกูลสถาปัตยกรรม
หากคุณเพิ่งใช้-mtune
คอมไพลเลอร์จะสร้างโค้ดที่ใช้งานได้กับโค้ดเหล่านี้ แต่จะสนับสนุนลำดับคำสั่งที่ทำงานเร็วที่สุดบน CPU เฉพาะที่คุณระบุ เช่นการตั้งค่าการวิเคราะห์พฤติกรรมแบบวนซ้ำอย่างเหมาะสมสำหรับซีพียูนั้น
-march=foo
โดยนัย-mtune=foo
เว้นแต่คุณจะระบุไฟล์-mtune
. นี่เป็นเหตุผลหนึ่งว่าทำไมการใช้งาน-march
จึงดีกว่าการเปิดใช้งานตัวเลือกต่างๆเช่น-mavx
โดยไม่ต้องทำอะไรเกี่ยวกับการปรับแต่ง
ข้อแม้: -march=native
บน CPU ที่ GCC ไม่ได้โดยเฉพาะการรับรู้จะยังคงเปิดใช้งานชุดคำสั่งใหม่ที่ GCC สามารถตรวจสอบได้ -mtune=generic
แต่จะออก ใช้ GCC ใหม่เพียงพอที่รู้เกี่ยวกับ CPU ของคุณหากคุณต้องการให้สร้างรหัสที่ดี
march
mtune
ดังนั้นคำตอบสำหรับการคัดค้านของคุณคือไม่ใช่และใช่ตามลำดับ
mtune
และการmarch
รวมกัน บล็อกโพสต์นี้ให้ความกระจ่างกับคนอื่น ๆ : lemire.me/blog/2018/07/25/…
นี่คือสิ่งที่ฉันทำขึ้น:
-march=X
ตัวเลือกใช้ชื่อซีพียูX
และช่วยให้ GCC X
เพื่อสร้างรหัสที่ใช้คุณสมบัติทั้งหมดของ คู่มือ GCC อธิบายอย่างชัดเจนว่าชื่อ CPU ใดหมายถึงตระกูลและคุณสมบัติของ CPU
เนื่องจากโดยปกติจะมีการเพิ่มคุณสมบัติ แต่ไม่ได้ลบออกไบนารีที่สร้างขึ้นด้วย-march=X
จะทำงานบน CPU X
จึงมีโอกาสที่ดีที่จะทำงานบน CPU ที่ใหม่กว่าX
แต่แทบจะไม่ทำงานบนสิ่งที่เก่ากว่าX
แน่นอน ชุดคำสั่งบางชุด (3DNow!, ฉันเดา?) อาจเฉพาะเจาะจงสำหรับผู้จำหน่าย CPU รายใดรายหนึ่งการใช้ประโยชน์จากสิ่งเหล่านี้อาจทำให้คุณได้รับไบนารีที่ไม่ทำงานบน CPU ที่แข่งขันกันใหม่กว่าหรืออย่างอื่น
-mtune=Y
ตัวเลือก tunes รหัสที่สร้างขึ้นเพื่อให้ทำงานได้เร็วขึ้นในY
กว่าซีพียูอื่น ๆ ก็อาจจะทำงานบน หมายถึง-march=X
จะไม่ลบล้างตัวอย่างเช่นอาจไม่สมเหตุสมผลและ- โค้ดของคุณจะไม่ทำงานกับสิ่งที่เก่ากว่าอยู่ดีเพราะเหตุใดคุณจึงต้องการเพิ่มประสิทธิภาพสำหรับสิ่งที่เก่ากว่า (คุณลักษณะน้อยกว่า) บน core2 บนโลก ทำให้รู้สึกมากขึ้น: ไม่ได้ใช้คุณสมบัติใด ๆ เกินกว่าสิ่งที่ให้ (ซึ่งยังคงมีมากขึ้นกว่าสิ่งที่จะช่วยให้คุณ!) แต่ทำรหัสเพิ่มประสิทธิภาพสำหรับรุ่นใหม่มากซีพียูไม่ได้สำหรับ-mtune=X
-mtune=Y
-march=X
-march=core2
-mtune=i686
core2
-march=core2
-march=core2 -mtune=haswell
core2
-march=i686
haswell
core2
-mtune=generic
นอกจากนี้ยังมี generic
ทำให้ GCC ผลิตโค้ดที่ทำงานได้ดีที่สุดบน CPU ปัจจุบัน (หมายถึงgeneric
การเปลี่ยนแปลงจาก GCC เวอร์ชันหนึ่งไปเป็นอีกเวอร์ชันหนึ่ง) มีข่าวลือในฟอรัม Gentoo ที่-march=X -mtune=generic
สร้างโค้ดที่ทำงานได้เร็วX
กว่าโค้ดที่สร้างขึ้นโดย-march=X -mtune=X
do (หรือเฉยๆ-march=X
ตาม-mtune=X
นัย) ไม่มีความคิดว่านี่เป็นเรื่องจริงหรือไม่
โดยทั่วไปแล้วถ้าคุณไม่ทราบแน่ชัดว่าคุณต้องการอะไรดูเหมือนว่าหลักสูตรที่ดีที่สุดคือการระบุ-march=<oldest CPU you want to run on>
และ-mtune=generic
( -mtune=generic
อยู่ที่นี่เพื่อตอบโต้โดยปริยาย-mtune=<oldest CPU you want to run on>
เพราะคุณอาจไม่ต้องการปรับให้เหมาะสมกับ CPU ที่เก่าที่สุด) หรือเพียงแค่-march=native
ถ้าคุณจะรันเฉพาะบนเครื่องเดียวกับที่คุณสร้าง
-march=native
คุณอาจต้องการระบุ-mtune=X
เนื่องจากค่าเริ่มต้นยังคง-mtune=generic
เป็นดังที่กล่าวไว้ที่นี่: lemire.me/blog/2018/07/25/…
-march=native
หมายความว่าใช้ได้tune=native
ดีถ้าคุณใช้ GCC ที่รู้เกี่ยวกับ CPU ของคุณ บทความนั้นนำเสนอเฉพาะกรณีเลวร้าย GCC เวอร์ชันใหม่กว่าจะสร้างโค้ดที่ดีกว่าโดยทั่วไปโดยเฉพาะอย่างยิ่งเมื่อใช้คำสั่งใหม่เช่น AVX2 และ AVX-512 และมีการตั้งค่าการปรับแต่ง (เช่นการวิเคราะห์พฤติกรรมแบบวนซ้ำ) ที่ออกแบบมาสำหรับ CPU ของคุณนั้นเป็นข้อดีอย่างแน่นอน ดังนั้นหากคุณสนใจเกี่ยวกับประสิทธิภาพที่จะใช้ตัวเลือกเหล่านี้มากพอให้ใช้ GCC ใหม่อย่างน้อยก็เป็นสิ่งที่รู้เกี่ยวกับ CPU ของคุณโดยเฉพาะอย่างยิ่งความเสถียรในปัจจุบันที่เกี่ยวข้อง
tune=generic
สมาชิกรุ่นใหม่ของตระกูล microarchitecture เดียวกันโดยเฉพาะอย่างยิ่งบางอย่างเช่น Kaby Lake ซึ่งเหมือนกับ Skylake microarchitecturally อย่างแท้จริง แต่ฉันคิดว่ามันยังคงมีครอบครัว / การก้าวที่แตกต่างออกไปดังนั้น GCC ที่รู้เกี่ยวกับ Skylake และรุ่นเก่าเท่านั้นที่ไม่สามารถจดจำมันเพื่อปรับแต่งได้