ข้อสรุปที่นี่:
คอมไพเลอร์ของ Fortran นั้นดีกว่ามากแค่ไหน?
คือ gfortran และ gcc นั้นรวดเร็วสำหรับโค้ดง่าย ๆ ฉันอยากลองอะไรที่ซับซ้อนกว่านี้ ฉันเอาตัวอย่างการยิงบรรทัดฐานสเปกตรัม ฉันก่อนการคำนวณเมทริกซ์ 2 มิติ A (:, :) แล้วคำนวณเกณฑ์ปกติ (วิธีแก้ปัญหานี้ไม่ได้รับอนุญาตในการยิงที่ฉันคิดว่า) ฉันได้ใช้ Fortran และรุ่น C นี่คือรหัส:
https://github.com/certik/spectral_norm
รุ่น gfortran ที่เร็วที่สุดคือ spectral_norm2.f90 และ spectral_norm6.f90 (อันหนึ่งใช้ matmul ในตัวและ dot_product ของ Fortran อีกตัวหนึ่งใช้ฟังก์ชันทั้งสองนี้ในรหัส - โดยไม่มีความแตกต่างด้านความเร็ว) รหัส C / C ++ ที่เร็วที่สุดที่ฉันสามารถเขียนได้คือ spectral_norm7.cpp การจับเวลาของ git รุ่น 457d9d9 บนแล็ปท็อปของฉันคือ:
$ time ./spectral_norm6 5500
1.274224153
real 0m2.675s
user 0m2.520s
sys 0m0.132s
$ time ./spectral_norm7 5500
1.274224153
real 0m2.871s
user 0m2.724s
sys 0m0.124s
ดังนั้นเวอร์ชันของ gfortran จึงเร็วขึ้นเล็กน้อย ทำไมถึงเป็นอย่างนั้น? หากคุณส่งคำขอดึงพร้อมการติดตั้ง C เร็วขึ้น (หรือเพียงวางรหัส) ฉันจะอัปเดตที่เก็บ
ใน Fortran ฉันผ่านอาร์เรย์ 2 มิติในขณะที่ใน CI ใช้อาร์เรย์ 1D อย่าลังเลที่จะใช้อาร์เรย์ 2 มิติหรือวิธีอื่นที่คุณเห็นว่าเหมาะสม
สำหรับคอมไพเลอร์ลองเปรียบเทียบ gcc กับ gfortran, icc vs ifort และอื่น ๆ (ไม่เหมือนกับหน้าจุดโทษซึ่งเปรียบเทียบ ifort กับ gcc.)
อัปเดต : ใช้รุ่น 179dae2 ซึ่งปรับปรุง matmul3 () ในเวอร์ชั่น C ของฉันตอนนี้มันเร็วพอ:
$ time ./spectral_norm6 5500
1.274224153
real 0m2.669s
user 0m2.500s
sys 0m0.144s
$ time ./spectral_norm7 5500
1.274224153
real 0m2.665s
user 0m2.472s
sys 0m0.168s
เวอร์ชัน vectorized ของ Pedro ด้านล่างนั้นเร็วกว่า:
$ time ./spectral_norm8 5500
1.274224153
real 0m2.523s
user 0m2.336s
sys 0m0.156s
ท้ายที่สุดจากรายงาน laxxy ด้านล่างสำหรับคอมไพเลอร์ของ Intel ดูเหมือนจะไม่แตกต่างกันมากนักและแม้แต่รหัส Fortran ที่ง่ายที่สุด (spectral_norm1) ก็เป็นวิธีที่เร็วที่สุด