Intel Fortran Compiler: เคล็ดลับในการเพิ่มประสิทธิภาพที่รวบรวม


21

ฉันจะเริ่มต้นด้วยประสบการณ์ส่วนตัวในห้องแล็บของเรา ย้อนกลับไปใน ifort 9 และ 10 วันเราเคยก้าวร้าวมากกับการปรับให้เหมาะสมรวบรวมด้วยแฟล็ก -O3 และตัวประมวลผลเฉพาะ (-xW -xSSE4.2 เป็นต้น) แต่เริ่มต้นด้วย ifort 11 เราเริ่มสังเกตเห็น:
1. ความไม่สอดคล้องกันบางอย่างในผลลัพธ์ (เพราะซีแมนทิกส์ไม่ได้รับการเก็บรักษาไว้)
2. กำไรเล็กลงเมื่อเทียบกับ -O2

ดังนั้นในปัจจุบันเรามักจะคอมไพล์ด้วย -O2 และ -xhost คุณมีคำแนะนำที่ดีกว่าสำหรับ ifort 11 หรือไม่ การเปลี่ยนแปลงนี้จะเกิดขึ้นอีกครั้งเมื่อเราเปลี่ยนเป็น ifort 12 หรือไม่ ขอบคุณล่วงหน้า.


7
การเพิ่มประสิทธิภาพไม่ได้รับประโยชน์รหัสทั้งหมดอย่างสม่ำเสมอ ดังนั้นฉันคิดว่าคำถามที่ดีกว่าคือ "ฉันจะบันทึกรหัสของฉันได้อย่างไรเพื่อบอกว่าการเพิ่มประสิทธิภาพของคอมไพเลอร์มีประสิทธิภาพอย่างไร"
Matt Knepley

1
เพราะความหมายไม่ได้ถูกเก็บรักษาไว้หรือเพราะบางสิ่งถูกสั่งใหม่? นี่อาจเดินไปนิดหน่อยจากหัวข้อ แต่ก็เป็นการดีที่จะเห็นตัวอย่างของโค้ดที่สร้างปัญหาขึ้นมาใหม่ อาจเป็นไปได้ว่ามีบางสิ่งที่เรียงลำดับใหม่ในแบบที่คุณไม่ชอบ แต่คอมไพเลอร์คิดว่าควรจะดี ประสบการณ์ของฉันคือการที่ Intel 12 ทำงานได้ดีกว่า vectorization มากกว่ารุ่นก่อน ๆ ดังนั้นฉันคาดว่าจะมีการเปลี่ยนแปลงเพิ่มขึ้นเมื่อคุณเปลี่ยนมาใช้เวอร์ชันล่าสุด
Bill Barth

ฉันคิดว่าความหมายไม่ได้ถูกเก็บรักษาไว้เท่ากับการสั่งซื้อไม่ได้รับการเก็บรักษาไว้ อย่างไรก็ตามฉันรู้ว่าคำถามของฉันคือ (เหมือนกัน) ทั่วไปและฉันไม่ต้องการที่จะอยู่ในเฉพาะ เรามีปัญหาหลายอย่างกับ intel 10 บางตัวเป็นข้อบกพร่องของคอมไพเลอร์และบางคนก็ไม่สามารถอธิบายได้ ดังนั้นด้วย 11 เราจึงเล่นได้อย่างปลอดภัยและเรามีความสุขกับการแสดง แต่บางทีเรากำลังเล่นมันปลอดภัยเกินไปและฉันต้องการทราบว่าชุมชนมีคำแนะนำหรือไม่
FrenchKeldar

คำตอบ:


16

เราขอแนะนำให้ผู้ใช้ของเราเริ่มต้นด้วย-O3 -xHost -ipoสำหรับทั้ง ifort 11 และ ifort 12 หากมีการเปิดใช้งานการแปลงทศนิยมโดยเฉพาะ O3 ที่มีผลต่อความแม่นยำของการคำนวณของคุณคุณสามารถปิดการคำนวณเหล่านั้นด้วย-fp-model precise -fp-model except(หรือรุนแรงยิ่งขึ้น-fp-model strict) ในขณะที่ยังคงรักษาการปรับให้เหมาะสมอื่น ๆ ไว้ O3 จะเปิดใช้งานเช่นการปิดกั้นลูปสำหรับแคชฟิวชั่นลูปและการยกเลิกการเปิดใช้งาน

ฉันแนะนำให้ลองทำสิ่งที่เป็นตัวแบบลอยตัวในแต่ละไฟล์และค้นหาว่ามันสร้างความแตกต่างได้ที่ไหน มันอาจเป็นความเร็วในการกระแทกประมาณ 15% และคุณต้องการที่จะรักษาสิ่งที่มันไม่ส่งผลกระทบต่อการคำนวณของคุณ หากคุณไม่แน่ใจว่าที่แม่นยำจะถูกผลกระทบ, คุณสามารถเล่นกับเปิดและปิดลอยธงรุ่นจุดสำหรับไฟล์เหล่านั้นหรือเล่นกับโหมดการปัดเศษ

เมื่อเร็ว ๆ นี้เราได้พูดคุยสั้น ๆ กับผู้ใช้ของเราเกี่ยวกับการปรับตั้งค่าสถานะเน้นไปที่คอมไพเลอร์ gnu และ intel สำหรับ x86; คุณสามารถดูภาพนิ่งจากการพูดคุยที่นี่

ในขณะที่เรากำลังพูดถึงการเลือกแฟล็กการปรับให้เหมาะสมสำหรับโค้ดของคุณทุก ๆ ครั้งและมันก็คุ้มค่าที่จะดูผลลัพธ์ของ-vec-reportเพื่อดูว่าคอมไพเลอร์พยายามที่จะทำให้เวกเตอร์วนซ้ำและไม่สามารถทำได้ บางครั้งมีการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ที่คุณสามารถทำได้กับลูปของคุณซึ่งอาจส่งผลให้เกิดการทำให้เป็นเวกเตอร์ได้ (ซึ่งอาจเป็นการเพิ่มความเร็ว 4x) ในทำนองเดียวกันสำหรับทั่วไปมากขึ้น-opt รายงาน


ผมชอบคำตอบของคุณ แต่ฉันได้พยายามอีกครั้งกับหนึ่งใน testcase ของเราและ-O3 -xhost -fp-model precise -fp-model exceptส่งผลให้ 30% ชะลอตัวลง ฉันจะดูอีกครั้งที่โปรไฟล์และ-vec-reportพยายามดูว่าเกิดอะไรขึ้น ...
FrenchKeldar

2
มากกว่า -O2 -xhost นั่นดูน่าสนใจ; มันผิดปกติมาก แต่ก็สามารถเกิดขึ้นได้ ในกรณีเช่นนี้เครื่องมือเพิ่มประสิทธิภาพกำลังทำอะไรบางอย่างที่มีเหตุผลที่ดีที่จะคิดว่าจะปรับปรุงความเร็ว แต่การเปิดใช้งานทำให้สิ่งต่าง ๆ แย่ลง ปกติแล้วสำหรับรหัสทางวิทยาศาสตร์ซึ่งมีโครงสร้างที่ค่อนข้างตรงไปตรงมานั้นจะไม่เกิดขึ้น ในกรณีเช่นนี้การเพิ่มประสิทธิภาพโปรไฟล์แนะนำ - software.intel.com/sites/products/documentation/hpc/compilerpro/ ...... - สามารถช่วยได้

5

ฉันทำงานให้กับ บริษัท ที่ผลิตแอพพลิเคชั่นขนาดใหญ่และมีเทคนิคสูงใน Fortran ด้วย IFort - แอพพลิเคชั่นมีความสำคัญอย่างยิ่งต่อประสิทธิภาพเนื่องจากความเร็ว (ในขณะที่ยังคงความแม่นยำ) เป็นจุดขายหลัก

เรารวบรวมกับ -O3 เสมอและสำหรับความรู้ของฉันสิ่งสำคัญที่ -O3 ทำคือการเปิดลูปและดึงข้อมูลล่วงหน้า ฉันสงสัยว่าแอปพลิเคชั่นการคำนวณทางวิทยาศาสตร์ส่วนใหญ่ได้รับประโยชน์อย่างมากจากสิ่งเหล่านี้โดยเฉพาะอย่างยิ่งการปรับลูปให้เหมาะสมที่สุด เราไม่ได้เห็นข้อผิดพลาดของคอมไพเลอร์ในบางครั้ง (แม้ว่าเราจะเห็นข้อผิดพลาด linker เล็กน้อยเมื่อใช้ Ifort บน Mac) เราใช้ 11.1.095

ฉันหวังว่านี่จะช่วยได้.


4

ฉันรู้ว่าคำตอบนี้อาจจะไกลเกินไปสายเกินไป แต่สำหรับการเพิ่มประสิทธิภาพอย่างก้าวร้าวตัวเลือก "เร็ว" ดูเหมือนจะเป็นทางออกที่ง่ายที่สุด ข้อความที่ตัดตอนมาจากหน้าคน:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.