GCC: March ต่างจาก mtune อย่างไร?


88

ฉันพยายามขัดหน้า GCC man สำหรับสิ่งนี้ แต่ก็ยังไม่ได้รับจริงๆ

อะไรคือความแตกต่างระหว่าง-marchและ-mtune?

เมื่อใดที่ใช้เพียงแค่-marchเทียบกับทั้งสองอย่าง เป็นไปได้ไหมที่จะเพียง-mtune?

คำตอบ:


97

หากคุณใช้-marchGCC จะมีอิสระในการสร้างคำสั่งที่ทำงานบน CPU ที่ระบุ แต่ (โดยทั่วไป) จะไม่ใช้กับ CPU รุ่นก่อนหน้าในตระกูลสถาปัตยกรรม

หากคุณเพิ่งใช้-mtuneคอมไพลเลอร์จะสร้างโค้ดที่ใช้งานได้กับโค้ดเหล่านี้ แต่จะสนับสนุนลำดับคำสั่งที่ทำงานเร็วที่สุดบน CPU เฉพาะที่คุณระบุ เช่นการตั้งค่าการวิเคราะห์พฤติกรรมแบบวนซ้ำอย่างเหมาะสมสำหรับซีพียูนั้น


-march=fooโดยนัย-mtune=fooเว้นแต่คุณจะระบุไฟล์-mtune. นี่เป็นเหตุผลหนึ่งว่าทำไมการใช้งาน-marchจึงดีกว่าการเปิดใช้งานตัวเลือกต่างๆเช่น-mavxโดยไม่ต้องทำอะไรเกี่ยวกับการปรับแต่ง

ข้อแม้: -march=nativeบน CPU ที่ GCC ไม่ได้โดยเฉพาะการรับรู้จะยังคงเปิดใช้งานชุดคำสั่งใหม่ที่ GCC สามารถตรวจสอบได้ -mtune=genericแต่จะออก ใช้ GCC ใหม่เพียงพอที่รู้เกี่ยวกับ CPU ของคุณหากคุณต้องการให้สร้างรหัสที่ดี


10
ไม่ตอบว่าเหมาะสมหรือไม่ที่จะใช้ทั้งสองอย่างหรือว่า mtune ซ้ำซ้อนเมื่อตั้งค่าเป็นค่าเดียวกัน
Pavel Šimerda

12
@ PavelŠimerdaคำตอบโดยสังหรณ์ใจโดยปริยายในคำจำกัดความของคุณลักษณะ 2 ประการนี้ นอกจากนี้เอกสารอย่างชัดเจนว่าหมายถึงmarch mtuneดังนั้นคำตอบสำหรับการคัดค้านของคุณคือไม่ใช่และใช่ตามลำดับ
underscore_d

ขอบคุณที่อธิบายเรื่องนี้อย่างสวยหรู! คุณทำให้เข้าใจง่าย
Rahim Khoja

5
ผู้คนต้องการ tl; dr: ใช้ -march ถ้าคุณเรียกใช้บนโปรเซสเซอร์ของคุณเท่านั้นให้ใช้ -mtune ถ้าคุณต้องการให้โปรเซสเซอร์อื่นปลอดภัย
j riv

3
ผู้ใช้ต้องเข้าใจด้วยว่าคอมไพเลอร์รุ่นเก่า (ออกก่อนซีพียูบางตัวไม่มี) อาจส่งผลให้เกิดความเหมาะสมmtuneและการmarchรวมกัน บล็อกโพสต์นี้ให้ความกระจ่างกับคนอื่น ๆ : lemire.me/blog/2018/07/25/…
qneill

53

นี่คือสิ่งที่ฉันทำขึ้น:

-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=i686core2-march=core2-march=core2 -mtune=haswellcore2-march=i686haswellcore2

-mtune=genericนอกจากนี้ยังมี genericทำให้ GCC ผลิตโค้ดที่ทำงานได้ดีที่สุดบน CPU ปัจจุบัน (หมายถึงgenericการเปลี่ยนแปลงจาก GCC เวอร์ชันหนึ่งไปเป็นอีกเวอร์ชันหนึ่ง) มีข่าวลือในฟอรัม Gentoo ที่-march=X -mtune=genericสร้างโค้ดที่ทำงานได้เร็วXกว่าโค้ดที่สร้างขึ้นโดย-march=X -mtune=Xdo (หรือเฉยๆ-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ถ้าคุณจะรันเฉพาะบนเครื่องเดียวกับที่คุณสร้าง


4
แต่ถ้าคุณใช้-march=nativeคุณอาจต้องการระบุ-mtune=Xเนื่องจากค่าเริ่มต้นยังคง-mtune=genericเป็นดังที่กล่าวไว้ที่นี่: lemire.me/blog/2018/07/25/…
Roland Weber

@RolandWeber: จะเกิดขึ้นก็ต่อเมื่อคุณใช้ GCC เก่าเกินไปที่จะรู้เกี่ยวกับ CPU ของคุณ -march=nativeหมายความว่าใช้ได้tune=nativeดีถ้าคุณใช้ GCC ที่รู้เกี่ยวกับ CPU ของคุณ บทความนั้นนำเสนอเฉพาะกรณีเลวร้าย GCC เวอร์ชันใหม่กว่าจะสร้างโค้ดที่ดีกว่าโดยทั่วไปโดยเฉพาะอย่างยิ่งเมื่อใช้คำสั่งใหม่เช่น AVX2 และ AVX-512 และมีการตั้งค่าการปรับแต่ง (เช่นการวิเคราะห์พฤติกรรมแบบวนซ้ำ) ที่ออกแบบมาสำหรับ CPU ของคุณนั้นเป็นข้อดีอย่างแน่นอน ดังนั้นหากคุณสนใจเกี่ยวกับประสิทธิภาพที่จะใช้ตัวเลือกเหล่านี้มากพอให้ใช้ GCC ใหม่อย่างน้อยก็เป็นสิ่งที่รู้เกี่ยวกับ CPU ของคุณโดยเฉพาะอย่างยิ่งความเสถียรในปัจจุบันที่เกี่ยวข้อง
Peter Cordes

มันเป็นการดูดที่ GCC ไม่สามารถทำได้ดีไปกว่าtune=genericสมาชิกรุ่นใหม่ของตระกูล microarchitecture เดียวกันโดยเฉพาะอย่างยิ่งบางอย่างเช่น Kaby Lake ซึ่งเหมือนกับ Skylake microarchitecturally อย่างแท้จริง แต่ฉันคิดว่ามันยังคงมีครอบครัว / การก้าวที่แตกต่างออกไปดังนั้น GCC ที่รู้เกี่ยวกับ Skylake และรุ่นเก่าเท่านั้นที่ไม่สามารถจดจำมันเพื่อปรับแต่งได้
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.