Fortran ง่ายกว่าการปรับให้เหมาะสมกว่า C สำหรับการคำนวณจำนวนมากหรือไม่


410

บางครั้งฉันอ่านว่า Fortran นั้นหรือเร็วกว่า C สำหรับการคำนวณหนัก เป็นเรื่องจริงเหรอ? ฉันต้องยอมรับว่าฉันแทบจะไม่รู้จัก Fortran แต่รหัส Fortran ที่ฉันเคยเห็นไม่ได้แสดงว่าภาษานั้นมีคุณสมบัติที่ C ไม่มีอยู่

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


53
เป็นการส่วนตัวจากคำตอบที่ให้ไว้ด้านล่าง ชื่อที่ถูกต้องคือ "มีเหตุผลทางสถาปัตยกรรม fundemental ใดทำไมคอมไพเลอร์ Fortran Might ผลิตรหัส optomised ดีกว่า C คอมไพเลอร์" แต่นั่นเป็นเพียงการหยิบจู้จี้
Martin Beckett

3
ฉันคิดว่าคำถามหัวเรื่องไม่ได้เป็นอัตนัยเพราะเป็นความเข้าใจผิดฉันคิดว่า คำถามที่มีรายละเอียดมากขึ้นไม่ใช่เรื่องส่วนตัว
jfm3

1
ฉันไม่คิดว่าใครจะเรียนรู้อะไรมากมายนอกจากนี้คำตอบคือ "ใช่" และ "ไม่" ในเวลาเดียวกันและแตกต่างกันไปตามคอมไพเลอร์แหล่งที่มาซีพียูเลย์เอาต์ของหน่วยความจำ ฯลฯ
7116

1
ฉันไม่คิดว่าคำถามหรือคำตอบนั้นเป็นเรื่องส่วนตัว แต่ถ้าคุณคิดว่าธงนี้ช่วยใครก็ได้ฉันก็สบายดี
quinmars

2
@sixlettervariables ถึงแม้ว่าคุณและฉันจะรู้คำตอบแล้ว แต่เป็นคำถามที่เกิดขึ้นกับคนส่วนใหญ่ในช่วงต้นอาชีพของพวกเขาและสิ่งสำคัญคือต้องเข้าใจคำตอบ แทนที่จะโพสต์ความคิดเห็นที่ถูกไล่ออกทำไมไม่หาคำตอบที่คุณเห็นด้วยและให้ +1
MarkJ

คำตอบ:


447

ภาษามีชุดคุณสมบัติที่คล้ายกัน ความแตกต่างด้านประสิทธิภาพนั้นมาจากข้อเท็จจริงที่ว่า Fortran กล่าวว่าไม่อนุญาตให้ใช้นามแฝงยกเว้นว่าจะมีการใช้คำสั่ง EQUIVALENCE รหัสใด ๆ ที่มีนามแฝงไม่ใช่ Fortran ที่ถูกต้อง แต่ขึ้นอยู่กับโปรแกรมเมอร์และไม่ใช่คอมไพเลอร์เพื่อตรวจหาข้อผิดพลาดเหล่านี้ คอมไพเลอร์ของ Fortran จึงเพิกเฉยต่อนามแฝงของพอยน์เตอร์ของหน่วยความจำที่เป็นไปได้ ดูตัวอย่างเล็ก ๆ น้อย ๆ นี้ใน C:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

ฟังก์ชั่นนี้จะทำงานช้ากว่าคู่ของ Fortran หลังจากปรับให้เหมาะสม ทำไมเป็นเช่นนั้น หากคุณเขียนค่าลงในอาร์เรย์เอาต์พุตคุณอาจเปลี่ยนค่าของเมทริกซ์ ท้ายที่สุดพอยน์เตอร์สามารถซ้อนทับและชี้ไปที่หน่วยความจำอันเดียวกัน (รวมถึงintตัวชี้!) คอมไพเลอร์ C ถูกบังคับให้โหลดค่าเมทริกซ์สี่ค่าจากหน่วยความจำสำหรับการคำนวณทั้งหมด

ใน Fortran คอมไพเลอร์สามารถโหลดค่าเมทริกซ์หนึ่งครั้งและเก็บไว้ในการลงทะเบียน มันสามารถทำได้เพราะคอมไพเลอร์ Fortran ถือว่าพอยน์เตอร์ / อาร์เรย์ไม่ทับซ้อนกันในหน่วยความจำ

โชคดีที่มีการใช้restrictคำหลักและการใช้ชื่อแทนอย่างเข้มงวดกับมาตรฐาน C99 เพื่อแก้ไขปัญหานี้ มันได้รับการสนับสนุนอย่างดีในคอมไพเลอร์ C ++ ส่วนใหญ่เช่นกัน คำสำคัญช่วยให้คุณสามารถให้คำแนะนำคอมไพเลอร์ที่โปรแกรมเมอร์สัญญาว่าตัวชี้ไม่ได้ใช้นามแฝงกับตัวชี้อื่น ๆ นามแฝงที่เข้มงวดหมายถึงโปรแกรมเมอร์สัญญาว่าพอยน์เตอร์ของประเภทที่แตกต่างกันจะไม่ทับซ้อนกันตัวอย่างเช่นdouble*จะไม่ทับซ้อนกับint*(ด้วยข้อยกเว้นเฉพาะที่char*และvoid*สามารถทับซ้อนกับสิ่งใดก็ได้)

หากคุณใช้พวกเขาคุณจะได้รับความเร็วเดียวกันจาก C และ Fortran อย่างไรก็ตามความสามารถในการใช้restrictคำหลักเฉพาะกับฟังก์ชั่นที่สำคัญด้านประสิทธิภาพหมายความว่าโปรแกรม C (และ C ++) นั้นปลอดภัยและง่ายต่อการเขียนมาก ตัวอย่างเช่นพิจารณารหัส Fortran ที่ไม่ถูกต้องCALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)ซึ่งคอมไพเลอร์ Fortran ส่วนใหญ่จะรวบรวมอย่างมีความสุขโดยไม่มีการเตือน แต่แนะนำข้อผิดพลาดที่แสดงเฉพาะในคอมไพเลอร์บางตัวในฮาร์ดแวร์บางตัวและตัวเลือกการปรับให้เหมาะสมบางอย่าง


26
จริงทั้งหมดและถูกต้อง jeff อย่างไรก็ตามฉันไม่พิจารณา "ถือว่าไม่มีนามแฝง" - สลับอย่างปลอดภัย มันสามารถทำลายรหัสที่สืบทอดมาจากโครงการอื่น ๆ ในรูปแบบที่ลึกซึ้งจนฉันไม่อยากใช้ ฉันได้กลายเป็นข้อ จำกัด - นาซีด้วยเหตุผลนั้น :-)
Nils Pipenbrinck

3
ถึงจุดที่สองของฉันคุณไม่ต้องใช้สวิตช์ alias compiler เพียงแค่เขียนโค้ดเพื่อให้ตัวโหลดตามตัวชี้ถูกกำหนดเป็นตัวแปรอัตโนมัติก่อนแล้วจึงทำงานกับระบบอัตโนมัติจากที่นั่น มันจะดู verbose มากขึ้น แต่มันจะปรับลงอย่างสมบูรณ์แบบโดยคอมไพเลอร์
เจฟฟ์ Tall

33
ตัวอย่างที่ดีคือการมีอยู่ของ memcpy () และ memmove () เท่านั้น ต่างจาก memcpy (), memmove () copes ที่มีพื้นที่ทับซ้อนกันดังนั้น memcpy () จึงสามารถเร็วกว่า memmove () ปัญหานี้เป็นเหตุผลที่เพียงพอสำหรับบางคนที่จะรวมสองฟังก์ชั่นแทนที่จะเป็นหนึ่งในห้องสมุดมาตรฐาน
jfs

12
ฉันคิดว่านั่นเป็นจุดของเซบาสเตียน - เนื่องจากความซับซ้อน / ความยืดหยุ่นของการจัดการหน่วยความจำ C แม้แต่สิ่งที่เรียบง่ายเหมือนกับการย้ายหน่วยความจำก็ยุ่งยาก
Martin Beckett

3
call transformตัวอย่างของคุณไม่มีความหมายมากนัก
Vladimir F

163

ใช่ในปี 1980 ในปี 2008? ขึ้นอยู่กับ

เมื่อฉันเริ่มเขียนโปรแกรมอย่างมืออาชีพการควบคุมความเร็วของ Fortran ก็แค่ถูกท้าทาย ฉันจำได้ว่าอ่านเรื่องนี้ในดร. ดอบบ์และบอกโปรแกรมเมอร์ผู้อาวุโสเกี่ยวกับบทความ - พวกเขาหัวเราะ

ดังนั้นฉันมีสองมุมมองเกี่ยวกับเรื่องนี้ทางทฤษฎีและการปฏิบัติ ในทางทฤษฎีแล้ว Fortran ในวันนี้ไม่มีข้อได้เปรียบที่แท้จริงต่อ C / C ++ หรือแม้แต่ภาษาใด ๆ ที่อนุญาตให้ประกอบรหัส ในทางปฏิบัติ Fortran วันนี้ยังคงสนุกกับประโยชน์ของมรดกของประวัติศาสตร์และวัฒนธรรมที่สร้างขึ้นโดยการเพิ่มประสิทธิภาพของรหัสตัวเลข

การพิจารณาถึงการออกแบบภาษาจนถึงขั้นสูงสุดและรวมถึง Fortran 77 เป็นประเด็นหลัก เนื่องจากสถานะของทฤษฎีคอมไพเลอร์และเทคโนโลยีสิ่งนี้มักจะหมายถึงการจำกัดคุณสมบัติและความสามารถเพื่อให้คอมไพเลอร์ยิงได้ดีที่สุดในการปรับโค้ดให้เหมาะสม การเปรียบเทียบที่ดีคือการคิดว่า Fortran 77 เป็นรถแข่งมืออาชีพที่เสียสละคุณสมบัติเพื่อความเร็ว วันนี้คอมไพเลอร์ได้รับดีกว่าในทุกภาษาและคุณสมบัติสำหรับการผลิตโปรแกรมเมอร์มีมูลค่ามากขึ้น อย่างไรก็ตามยังมีสถานที่ที่ผู้คนส่วนใหญ่กังวลกับความเร็วในการคำนวณทางวิทยาศาสตร์ คนเหล่านี้ส่วนใหญ่ได้รับรหัสการฝึกอบรมและวัฒนธรรมจากผู้ที่เป็นโปรแกรมเมอร์ของ Fortran

เมื่อหนึ่งเริ่มพูดคุยเกี่ยวกับการเพิ่มประสิทธิภาพของรหัสที่มีปัญหาหลายอย่างและวิธีที่ดีที่สุดที่จะได้รับความรู้สึกนี้คือการแฝงตัวอยู่ที่คนที่มีงานก็คือการมีรหัสตัวเลขอย่างรวดเร็ว แต่เก็บไว้ในใจว่ารหัสดังกล่าวที่มีความสำคัญอย่างยิ่งมักจะเป็นส่วนเล็ก ๆ ของสายการโดยรวมของรหัสและความเชี่ยวชาญมาก: จำนวนมากรหัส Fortran เป็นเพียง "ไม่มีประสิทธิภาพ" เป็นจำนวนมากรหัสอื่น ๆ ในภาษาอื่น ๆ และการเพิ่มประสิทธิภาพไม่ควรแม้แต่จะ ความกังวลหลักของรหัสดังกล่าว

สถานที่ที่ยอดเยี่ยมในการเริ่มเรียนรู้เกี่ยวกับประวัติศาสตร์และวัฒนธรรมของ Fortran คือวิกิพีเดีย รายการ Fortran Wikipediaนั้นยอดเยี่ยมมากและฉันขอขอบคุณผู้ที่ใช้เวลาและความพยายามในการสร้างคุณค่าให้กับชุมชน Fortran

(คำตอบที่สั้นกว่านี้น่าจะเป็นความคิดเห็นในหัวข้อที่ยอดเยี่ยมซึ่งเริ่มโดยNilsแต่ฉันไม่มีกรรมที่จะทำเช่นนั้นจริง ๆ แล้วฉันอาจจะไม่ได้เขียนอะไรเลย แต่สำหรับหัวข้อนี้มีจริง เนื้อหาข้อมูลและการแบ่งปันต่างจากสงครามเปลวไฟและความคลั่งไคล้ภาษาซึ่งเป็นประสบการณ์หลักของฉันในเรื่องนี้ฉันรู้สึกท่วมท้นและต้องแบ่งปันความรัก)


1
ลิงค์: web.archive.org/web/20090401205830/http://ubiety.uwaterloo.ca/ไม่ทำงานอีกต่อไป มีลิงค์ทางเลือกอื่นหรือไม่?
ธาเนียล

64

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

การคูณเมทริกซ์หนาแน่นคือ:

matmul(a,b)

L2 norm ของเวกเตอร์ x คือ:

sqrt(sum(x**2))

นอกจากนี้งบเช่นFORALL, PUREและELEMENTALขั้นตอนอื่น ๆ ต่อไปเพื่อช่วยเหลือรหัสเพิ่มประสิทธิภาพ แม้แต่พอยน์เตอร์ใน Fortran ก็มีความยืดหยุ่นเท่ากับ C เนื่องจากเหตุผลง่าย ๆ นี้

มาตรฐาน Fortran ที่กำลังจะมีขึ้น (2008) มีการจัดเรียงร่วมซึ่งช่วยให้คุณสามารถเขียนโค้ดแบบขนานได้อย่างง่ายดาย G95 (โอเพ่นซอร์ส) และคอมไพเลอร์จาก CRAY รองรับอยู่แล้ว

ดังนั้นใช่ Fortran สามารถทำได้อย่างรวดเร็วเพียงเพราะคอมไพเลอร์สามารถปรับให้เหมาะสม / ขนานได้ดีกว่า C / C ++ แต่อีกครั้งเหมือนทุกสิ่งทุกอย่างในชีวิตมีคอมไพเลอร์ที่ดีและคอมไพเลอร์ที่ไม่ดี


คุณอาจต้องการอ่านpimiddy.wordpress.com/2012/04/20/pure-functions-in-ccและopen-std.org/jtc1/sc22/wg21/docs/papers/2015/p0078r0.pdfเช่นกัน
Jeff

1
การforallสร้างถูกคัดค้านเนื่องจากคอมไพเลอร์ไม่สามารถปรับโค้ดให้เหมาะสม do concurrentเปลี่ยนเป็น นอกจากนี้รหัสดูเหมือนไม่มีประสิทธิภาพเพราะคอมไพเลอร์อาจจะสร้างเวกเตอร์ทั้งหมดsqrt(sum(x**2)) x**2ฉันเดาว่าการวนซ้ำนั้นดีกว่า แต่ก็เป็นการดีที่สุดที่จะเรียกใช้norm2ฟังก์ชันที่แท้จริง
A. Hennink

39

มันตลกที่คำตอบมากมายที่นี่จากการไม่รู้ภาษา นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับโปรแกรมเมอร์ C / C ++ ที่ได้เปิดและรหัส FORTRAN 77 เก่าและหารือเกี่ยวกับจุดอ่อน

ฉันคิดว่าปัญหาความเร็วส่วนใหญ่เป็นคำถามระหว่าง C / C ++ และ Fortran ในรหัสขนาดใหญ่มันขึ้นอยู่กับโปรแกรมเมอร์เสมอ มีคุณสมบัติบางอย่างของภาษาที่ Fortran ทำได้ดีกว่าและคุณสมบัติบางอย่างที่ C ทำ ดังนั้นในปี 2011 ไม่มีใครสามารถพูดได้ว่าอันไหนเร็วกว่ากัน

เกี่ยวกับภาษานั้นปัจจุบัน Fortran รองรับคุณสมบัติ Full OOP และรองรับการทำงานย้อนหลังได้อย่างสมบูรณ์ ฉันใช้ Fortran 2003 อย่างถี่ถ้วนและฉันอยากจะบอกว่ามันน่าใช้ ในบางแง่มุม Fortran 2003 ยังคงอยู่หลัง C ++ แต่มาดูการใช้งานกันดีกว่า Fortran ส่วนใหญ่ใช้สำหรับการคำนวณเชิงตัวเลขและไม่มีใครใช้คุณสมบัติ C ++ OOP แฟนซีเนื่องจากเหตุผลด้านความเร็ว ในการคำนวณประสิทธิภาพสูง C ++ แทบจะไม่มีที่ให้ไปเลย (ดูที่มาตรฐาน MPI และคุณจะเห็นว่า C ++ เลิกใช้แล้ว!)

ทุกวันนี้คุณสามารถเขียนโปรแกรมผสมภาษากับ Fortran และ C / C ++ มีอินเทอร์เฟซสำหรับ GTK + ใน Fortran มีคอมไพเลอร์ฟรี (gfortran, g95) และคอมไพล์โฆษณาที่ยอดเยี่ยมมากมาย


8
คุณช่วยเพิ่มแหล่งที่มาประสบการณ์ที่เฉพาะเจาะจงหรือสถาบันทางวิทยาศาสตร์ / หน่วยประมวลผลประสิทธิภาพสูงที่ย้ายออกจาก C ++ สำหรับโครงการในอนาคตหรือเขียนโครงการ c ++ เป็นภาษาอื่นได้ไหม ฉันถามเพราะฉันรู้สถาบันวิทยาศาสตร์อย่างน้อยสองแห่งคือ Sandia และ CERN ที่ใช้ c ++ สำหรับการสร้างแบบจำลองที่มีประสิทธิภาพสูง นอกจากนี้ Sandia ยังได้แปลงหนึ่งในซอฟต์แวร์การสร้างแบบจำลอง (LAMMPS) จาก fortran ไปเป็น c ++ ซึ่งเป็นการเพิ่มประสิทธิภาพที่ยอดเยี่ยม
Zachary Kraus

7
LAMMPS เขียนด้วย C ++ ที่แสนง่ายซึ่งไม่ได้ใช้ประโยชน์จากคุณลักษณะส่วนใหญ่ของภาษา มันแสดงถึง C ++ ที่โปรแกรมเมอร์ของ Fortran ที่รู้จัก C เขียนหลังจากเรียนรู้ C ++ 98 นี่ไม่ใช่การบอกว่า LAMMPS เขียนได้ไม่ดี แต่ไม่ใช่ตัวอย่างที่คุณต้องการอ้างถึงเมื่อเรียกร้องให้ C ++ ใน HPC
Jeff

30

มีสาเหตุหลายประการที่ทำให้ฟอร์แทรนเร็วขึ้น อย่างไรก็ตามจำนวนเงินที่พวกเขามีความสำคัญนั้นไม่มากนักหรือสามารถแก้ไขได้อย่างไรก็ตามมันไม่สำคัญ เหตุผลหลักในการใช้ Fortran ในปัจจุบันคือการบำรุงรักษาหรือขยายการใช้งานแบบดั้งเดิม

  • คำหลักเพียวและองค์ประกอบในฟังก์ชัน นี่คือฟังก์ชั่นที่ไม่มีผลข้างเคียง สิ่งนี้ยอมให้การออปติไมซ์ในบางกรณีที่คอมไพเลอร์รู้ว่าฟังก์ชั่นเดียวกันจะถูกเรียกด้วยค่าเดียวกัน หมายเหตุ: GCC ใช้ "บริสุทธิ์" เป็นส่วนขยายของภาษา คอมไพเลอร์อื่น ๆ เช่นกัน การวิเคราะห์ระหว่างโมดูลสามารถทำการปรับให้เหมาะสมนี้ แต่ก็ยาก

  • ชุดฟังก์ชันมาตรฐานที่จัดการกับอาร์เรย์ไม่ใช่องค์ประกอบแต่ละตัว สิ่งต่าง ๆ เช่น sin (), log (), sqrt () รับอาร์เรย์แทนสเกลาร์ สิ่งนี้ทำให้ง่ายต่อการปรับแต่งตามปกติ Auto-vectorization ให้ประโยชน์เหมือนกันในกรณีส่วนใหญ่หากฟังก์ชั่นเหล่านี้เป็นแบบอินไลน์หรือในตัว

  • Builtin ชนิดซับซ้อน ในทางทฤษฎีสิ่งนี้อาจทำให้คอมไพเลอร์เรียงลำดับใหม่หรือกำจัดคำสั่งบางอย่างในบางกรณี แต่เป็นไปได้ว่าคุณจะเห็นประโยชน์แบบเดียวกันกับโครงสร้าง {double re, im; }; สำนวนที่ใช้ใน C. มันทำให้การพัฒนาเร็วขึ้นแม้ว่าในขณะที่ผู้ประกอบการทำงานในประเภทที่ซับซ้อนใน Fortran


1
"แต่เป็นไปได้ว่าคุณจะเห็นประโยชน์แบบเดียวกันกับโครงสร้าง{ double re, im; };สำนวนที่ใช้ใน C" คอมไพเลอร์ C ส่วนใหญ่จะคืนค่าโครงสร้างในรูปแบบ sret ด้วย caller stack ที่จัดสรรพื้นที่ผ่านตัวชี้ไปยัง callee ที่เติมเข้าไปซึ่งจะช้ากว่าการส่งคืนค่าหลายค่าในรีจิสเตอร์เช่นเดียวกับ Fortran compiler โปรดทราบว่า C99 แก้ไขในกรณีพิเศษที่ซับซ้อน
Jon Harrop

ฉันไม่แน่ใจว่าฉันเห็นด้วยกับเหตุผลหลักของคุณ โดยส่วนตัวผมชอบที่จะใช้ Fortran สำหรับโค้ดหนักทางคณิตศาสตร์ที่ฟังก์ชันอาร์เรย์และคณิตศาสตร์เป็นส่วนที่สำคัญที่สุดของรหัส แต่ฉันรู้ถึงความจริงในสถาบันรัฐบาลและธนาคารจำนวนมากพวกเขายังคงใช้ Fortran เพื่อรักษาหรือขยายรหัสเดิม ฉันเองใช้ fortran เพื่อขยายรหัสอาจารย์ในปริญญาเอกของฉัน คณะกรรมการเขียน
Zachary Kraus

ข้อความของคุณ "เหตุผลหลักในการใช้ Fortran ทุกวันนี้ก็คือการบำรุงรักษาหรือการขยายแอปพลิเคชันแบบดั้งเดิม" นั้นผิดทั้งหมด ฉันยังไม่เห็นภาษาการเขียนโปรแกรมอื่นใดแม้จะอยู่ใกล้กับคุณสมบัติที่ Fortran นำเสนอโดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันทางคณิตศาสตร์ คุณได้ตั้งชื่อไปแล้วสองสามอย่างเช่นการสนับสนุนอาเรย์ที่ยอดเยี่ยมการคำนวณทางคณิตศาสตร์ที่ซับซ้อนในตัวฟังก์ชั่นบริสุทธิ์หรือองค์ประกอบ - และฉันก็สามารถตั้งชื่อได้มากขึ้นเช่นกัน เพียงอย่างเดียวก็เพียงพอที่จะพิสูจน์ว่าข้อความของคุณด้านบนผิด
Pap

28

ฉันคิดว่าจุดสำคัญในความโปรดปรานของ Fortran คือมันเป็นภาษาที่เหมาะสำหรับการแสดงเวกเตอร์และอาเรย์คณิตศาสตร์ ปัญหาการวิเคราะห์ตัวชี้ที่กล่าวถึงข้างต้นนั้นเป็นจริงในทางปฏิบัติเนื่องจากรหัสพกพาไม่สามารถสรุปได้ว่าคุณสามารถบอกคอมไพเลอร์ได้ มีข้อได้เปรียบเสมอในการแสดงออก computaitons ในลักษณะที่ใกล้กับลักษณะโดเมน C ไม่มีอาร์เรย์จริงๆเลยถ้าคุณมองอย่างใกล้ชิดมีอะไรบางอย่างที่เหมือนมัน Fortran มีรูปวาดจริง ซึ่งทำให้การรวบรวมอัลกอริทึมบางประเภททำได้ง่ายขึ้นโดยเฉพาะอย่างยิ่งสำหรับเครื่องจักรแบบขนาน

ลึกลงไปในสิ่งต่าง ๆ เช่นระบบเวลาทำงานและการประชุมที่เรียกว่า C และ Fortran ที่ทันสมัยมีความคล้ายคลึงกันมากพอที่จะเห็นว่าอะไรจะสร้างความแตกต่างได้ยาก โปรดทราบว่า C ที่นี่เป็นฐาน C: C ++ จริง ๆ เป็นปัญหาที่แตกต่างกันโดยสิ้นเชิงกับประสิทธิภาพที่แตกต่างกันมาก


25

ไม่มีสิ่งดังกล่าวเป็นหนึ่งในภาษาได้เร็วกว่าที่อื่นดังนั้นคำตอบที่เหมาะสมคือไม่มี

สิ่งที่คุณต้องถามจริงๆคือ "โค้ดที่คอมไพล์ด้วย Fortran คอมไพเลอร์ X เร็วกว่าโค้ดที่คอมไพล์ด้วยคอมไพเลอร์ C Y" แน่นอนว่าคำตอบสำหรับคำถามนั้นขึ้นอยู่กับคอมไพเลอร์สองตัวที่คุณเลือก

อีกคำถามหนึ่งที่อาจถามได้ก็คือ "การใช้ความพยายามในปริมาณที่เท่ากันในการปรับแต่งคอมไพเลอร์ของพวกเขา คำตอบนี้ในความเป็นจริงจะเป็นFortran คอมไพเลอร์ Fortran มีข้อดีของใบรับรอง:

  • Fortran ต้องแข่งขันกับ Assembly ในวันที่ผู้ประกาศสาบานว่าจะไม่ใช้คอมไพเลอร์ดังนั้นจึงออกแบบมาเพื่อความเร็ว C ถูกออกแบบมาให้มีความยืดหยุ่น
  • โพรงของ Fortran ได้รับการกระทืบจำนวนมาก ในรหัสโดเมนนี้จะไม่เร็วพอ ดังนั้นจึงเป็นเรื่องที่กดดันอย่างมากที่จะทำให้ภาษามีประสิทธิภาพ
  • งานวิจัยส่วนใหญ่เกี่ยวกับการปรับแต่งคอมไพเลอร์ทำได้โดยผู้ที่สนใจในการเร่งความเร็วรหัสการบีบอัดหมายเลข Fortran ดังนั้นการเพิ่มประสิทธิภาพรหัส Fortran เป็นปัญหาที่รู้จักกันดีกว่าการปรับภาษาที่รวบรวมอื่น ๆ และนวัตกรรมใหม่แสดงในคอมไพเลอร์ Fortran ก่อน
  • Biggie : C สนับสนุนให้ใช้ตัวชี้มากกว่า Fortran สิ่งนี้จะเพิ่มขอบเขตที่เป็นไปได้ของรายการข้อมูลใด ๆ ในโปรแกรม C ซึ่งทำให้ยากที่จะปรับให้เหมาะสม โปรดทราบว่า Ada นั้นดีกว่า C ในขอบเขตนี้และเป็นภาษา OO ที่ทันสมัยกว่า Fortran77 ที่พบโดยทั่วไป ถ้าคุณต้องการให้ OO Spam สามารถสร้างรหัสได้เร็วกว่า C นี่เป็นตัวเลือกสำหรับคุณ
  • ลูกค้าของคอมไพเลอร์ Fortran มีแนวโน้มที่จะใส่ใจในเรื่องการปรับให้เหมาะสมมากกว่าลูกค้าของคอมไพเลอร์ C

อย่างไรก็ตามไม่มีอะไรจะหยุดใครบางคนจากการพยายามเพิ่มประสิทธิภาพของคอมไพเลอร์ C ของพวกเขาและทำให้มันสร้างรหัสที่ดีกว่าคอมไพเลอร์ Fortran แพลตฟอร์มของพวกเขา ในความเป็นจริงยอดขายที่เพิ่มขึ้นจากคอมไพเลอร์ C ทำให้สถานการณ์นี้เป็นไปได้ค่อนข้างมาก


4
ฉันเห็นด้วย. และฉันขอเพิ่มเติมด้วยว่าเมื่อ Fortran เปิดตัว (เป็นภาษาระดับสูงคนแรก) ในช่วงปลายยุค 50 ต้น ๆ หลายคนมีความสงสัยเกี่ยวกับประสิทธิภาพของมัน ดังนั้นผู้พัฒนาจึงต้องพิสูจน์ว่า Fortran นั้นมีประสิทธิภาพและมีประโยชน์และกำหนดที่จะ "ปรับตัวให้เข้ากับความตาย" เพื่อพิสูจน์ประเด็นของพวกเขา C มามาก (ต้นถึงกลางปี ​​70) และไม่มีอะไรจะพิสูจน์ดังนั้นพูด แต่ในเวลานี้มีการเขียนรหัส Fortran จำนวนมากเพื่อให้ชุมชนวิทยาศาสตร์ติดอยู่และยังคงทำเช่นนั้น ฉันไม่ได้ตั้งโปรแกรม Fortran แต่ฉันได้เรียนรู้วิธีเชื่อมโยงเพื่อเรียกรูทีนย่อย Fortran จาก C ++
Olumide

3
การวิจัยเกี่ยวกับการปรับให้เหมาะสมของคอมไพเลอร์นั้นมีความหลากหลายมากกว่าที่คุณคิด ยกตัวอย่างเช่นประวัติของการใช้งาน LISP นั้นเต็มไปด้วยความสำเร็จในการทำตัวเลขให้เร็วกว่า Fortran (ซึ่งยังคงเป็นคู่แข่งเริ่มต้นที่จะท้าทาย) นอกจากนี้ส่วนใหญ่ของการเพิ่มประสิทธิภาพคอมไพเลอร์ได้กำหนดเป้าหมายการเป็นตัวแทนระดับกลางของคอมไพเลอร์ซึ่งหมายความว่าความแตกต่างในความหมายกัน (เช่นนามแฝง) พวกเขานำไปใช้กับภาษาการเขียนโปรแกรมใด ๆ ในชั้นเรียนที่กำหนด
ไม่มีที่ไหนเลยมนุษย์

2
ความคิดนั้นซ้ำไปซ้ำมามาก แต่มันก็ไม่ตรงไปตรงมาที่จะบอกว่าไม่มีผลใด ๆ ต่อประสิทธิภาพในการออกแบบภาษาโปรแกรม คุณสมบัติภาษาการเขียนโปรแกรมบางอย่างจำเป็นต้องนำไปสู่ความไร้ประสิทธิภาพเพราะพวกเขา จำกัด ข้อมูลที่มีอยู่ในเวลารวบรวม
Praxeolitic

@ Praxeolitic - มันค่อนข้างถูกต้อง (ซึ่งเป็นเหตุผลที่ฉันดีใจที่ฉันไม่ได้พูดอะไรแบบนั้น)
TED

@TED ​​สุจริตกลับมาที่นี่อีกสองสามเดือนต่อมาฉันไม่รู้ว่าทำไมฉันถึงแสดงความคิดเห็นในคำตอบของคุณ บางทีฉันตั้งใจจะทิ้งมันไว้ที่อื่นล่ะ? XP
Praxeolitic

22

มีรายการอื่นที่ Fortran แตกต่างจาก C - และอาจเร็วกว่า Fortran มีกฎการปรับให้เหมาะสมที่ดีกว่า C ใน Fortran ลำดับการประเมินผลของนิพจน์ไม่ได้กำหนดไว้ซึ่งอนุญาตให้คอมไพเลอร์ปรับให้เหมาะสม - หากต้องการบังคับลำดับที่แน่นอนให้ใช้วงเล็บ ใน C ลำดับนั้นเข้มงวดกว่า แต่ด้วยตัวเลือก "-fast" พวกเขาจะผ่อนคลายมากขึ้นและ "(... )" ก็จะถูกละเว้นเช่นกัน ฉันคิดว่า Fortran มีวิธีที่อยู่ตรงกลาง (เช่นกัน IEEE ทำให้การถ่ายทอดสดเป็นเรื่องยากมากขึ้นเนื่องจากการเปลี่ยนแปลงลำดับการประเมินผลบางอย่างต้องการให้ไม่มีการล้นมากเกินไปซึ่งจะต้องถูกเพิกเฉย

อีกพื้นที่ของกฎที่ชาญฉลาดคือตัวเลขที่ซับซ้อน ไม่เพียง แต่จะใช้เวลาจนถึง C 99 ที่ C มีอยู่เท่านั้น แต่กฎที่ควบคุมพวกเขานั้นดีกว่าใน Fortran ตั้งแต่ห้องสมุด Fortran ของ gfortran เขียนบางส่วนใน C แต่ใช้ความหมาย Fortran, GCC ได้รับตัวเลือก (ซึ่งสามารถใช้กับโปรแกรม C "ปกติ"):

-fcx-fortran-rules การคูณและการหารที่ซับซ้อนเป็นไปตามกฎของ Fortran การลดระยะจะทำในส่วนของการแบ่งที่ซับซ้อน แต่ไม่มีการตรวจสอบว่าผลลัพธ์ของการคูณที่ซับซ้อนหรือการหารคือ "NaN + I * NaN" ด้วยความพยายามที่จะช่วยเหลือสถานการณ์ในกรณีนั้น

กฎนามแฝงที่กล่าวถึงข้างต้นเป็นโบนัสอื่นและอย่างน้อยก็ในหลักการ - การดำเนินการทั้งหมดของอาเรย์ซึ่งหากพิจารณาอย่างเหมาะสมโดยเครื่องมือเพิ่มประสิทธิภาพของคอมไพเลอร์สามารถนำโค้ดได้เร็วขึ้น ในทางตรงกันข้ามการดำเนินการบางอย่างใช้เวลามากขึ้นเช่นหากมีการมอบหมายอาร์เรย์ที่จัดสรรได้มีการตรวจสอบจำนวนมากที่จำเป็น (จัดสรรใหม่? [คุณสมบัติ Fortran 2003] มีความก้าวหน้าของอาร์เรย์ ฯลฯ ) ซึ่งทำให้ การใช้งานง่ายซับซ้อนกว่าเบื้องหลัง - และช้าลง แต่ทำให้ภาษามีประสิทธิภาพมากขึ้น ในทางกลับกันการดำเนินการของอาเรย์ที่มีขอบเขตและความยืดหยุ่นทำให้การเขียนโค้ดง่ายขึ้นและคอมไพเลอร์มักจะปรับโค้ดให้เหมาะสมกว่าผู้ใช้

โดยรวมแล้วฉันคิดว่าทั้ง C และ Fortran นั้นเร็วพอ ๆ กัน ตัวเลือกควรมีมากกว่าภาษาใดที่ชอบมากกว่าหรือไม่ว่าการใช้การดำเนินการทั้งชุดของ Fortran และการพกพาที่ดีกว่านั้นมีประโยชน์มากกว่าหรือการเชื่อมต่อกับระบบและไลบรารีส่วนติดต่อผู้ใช้แบบกราฟิกที่ดีขึ้นใน C.


"การช่วยเหลือ" ที่มีความหมายในกรณี Nan + INan คืออะไร สิ่งที่ทำให้อินฟินิตี้ต่างจาก NaN คืออินฟินิตี้ถูกเซ็นชื่อ การดำเนินการที่เกี่ยวข้องกับอินฟินิตี้ที่ไม่ซับซ้อนที่จะให้สัญญาณที่ยุ่งเหยิงทำให้เกิด NaN และฉันไม่เห็นเหตุผลว่าจำนวนเชิงซ้อนควรทำอย่างอื่น หากหนึ่งทวีคูณ (DBL_MAX, DBL_MAX) โดย (2,2), ยกกำลังสองผลแล้วยกกำลังสองที่ผลลัพธ์สิ่งที่ควรเป็นสัญญาณของผลลัพธ์ในกรณีที่ไม่มีล้น? อะไรคือสิ่งที่แทนที่มันด้วย (1.001, DBL_MAX) ฉันถือว่า (NaN, NaN) เป็นคำตอบที่ถูกต้องและการรวมกันของอนันต์และ NaN เป็นเรื่องไร้สาระ
supercat

14

ไม่มีอะไรเกี่ยวกับภาษา Fortran และ C ซึ่งทำให้เร็วกว่าอีกภาษาหนึ่งสำหรับวัตถุประสงค์เฉพาะ มีบางอย่างเกี่ยวกับคอมไพเลอร์เฉพาะสำหรับแต่ละภาษาเหล่านี้ซึ่งทำให้มีประโยชน์สำหรับงานบางอย่างมากกว่าคนอื่น ๆ

เป็นเวลาหลายปีที่คอมไพเลอร์ของ Fortran มีตัวตนซึ่งสามารถทำเวทย์มนตร์ดำให้กับกิจวัตรตัวเลขของคุณทำให้การคำนวณที่สำคัญหลายอย่างรวดเร็วอย่างบ้าคลั่ง คอมไพเลอร์ C ร่วมสมัยทำไม่ได้เช่นกัน เป็นผลให้จำนวนไลบรารีที่ดีของรหัสเติบโตใน Fortran หากคุณต้องการใช้ห้องสมุดที่ได้รับการทดสอบเป็นอย่างดีและยอดเยี่ยมเหล่านี้คุณจะต้องคอมไพเลอร์ Fortran

การสังเกตอย่างไม่เป็นทางการของฉันแสดงให้เห็นว่าทุกวันนี้ผู้คนใส่รหัสการคำนวณที่หนักหน่วงของพวกเขาในภาษาเก่า ๆ และถ้ามันใช้เวลาสักพักหนึ่งพวกเขาจะหาเวลาในกลุ่มการคำนวณราคาถูก กฎของมัวร์ทำให้คนโง่เป็นพวกเราทั้งหมด


11
เกือบปรับปรุงแล้ว ปัญหาคือว่า Fortran ไม่มีข้อได้เปรียบโดยธรรมชาติบางอย่าง อย่างไรก็ตามคุณค่อนข้างเห็นพ้องกันว่าสิ่งสำคัญที่ต้องพิจารณาคือคอมไพเลอร์ไม่ใช่ภาษา
TED

14

ฉันเปรียบเทียบความเร็วของ Fortran, C และ C ++ กับเกณฑ์มาตรฐาน Levine-Callahan-Dongarra คลาสสิกจาก netlib เวอร์ชันภาษาหลายภาษาที่มี OpenMP นั้นคือ http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors The C นั้นน่าเกลียดกว่าเมื่อมันเริ่มด้วยการแปลอัตโนมัติรวมถึงการ จำกัด และ pragmas คอมไพเลอร์ C ++ เป็นเพียง C พร้อมเทมเพลต STL ถ้ามี ในมุมมองของฉัน STL เป็นถุงแบบผสมเพื่อปรับปรุงการบำรุงรักษา

มีเพียงการฝึกฟังก์ชั่นอัตโนมัติเพียงเล็กน้อยเท่านั้นเพื่อดูว่าขอบเขตนั้นปรับปรุงการเพิ่มประสิทธิภาพให้ดีที่สุดอย่างไรเนื่องจากตัวอย่างนั้นยึดตามแนวปฏิบัติของ Fortran แบบดั้งเดิม

คอมไพเลอร์ C / C ++ ที่มีการใช้งานกันอย่างแพร่หลายมากที่สุดขาด auto-vectorization ซึ่งเกณฑ์มาตรฐานเหล่านี้พึ่งพาอย่างหนัก

โพสต์ที่เพิ่งเกิดขึ้นก่อนหน้านี้มีตัวอย่างสองสามตัวอย่างที่ใช้วงเล็บใน Fortran เพื่อกำหนดลำดับการประเมินที่เร็วขึ้นหรือแม่นยำยิ่งขึ้น คอมไพเลอร์ C ที่รู้จักกันไม่มีตัวเลือกในการสังเกตวงเล็บโดยไม่ปิดใช้งานการปรับให้เหมาะสมที่สำคัญกว่า


จำเป็นต้องใช้การแปลที่น่าเกลียดเพื่อเอาชนะปัญหานามแฝง คุณต้องให้ตัวแปร mock ของคอมไพเลอร์เพื่อบอกว่าตัวแปร byref ที่ใช้งานเป็นพอยน์เตอร์สามารถปรับให้เหมาะสมในการลงทะเบียน
David

12

ฉันเป็นโปรแกรมเมอร์มือสมัครเล่นและฉัน "เฉลี่ย" ทั้งสองภาษา ฉันพบว่าการเขียนโค้ด Fortran ง่ายกว่ารหัส C (หรือ C ++) ง่ายกว่า ทั้ง Fortran และ C เป็นภาษา "ประวัติศาสตร์" (ตามมาตรฐานในปัจจุบัน) มีการใช้งานอย่างหนักและได้รับการสนับสนุนอย่างดีทั้งคอมไพเลอร์ฟรีและโฆษณาเชิงพาณิชย์

ฉันไม่รู้ว่ามันเป็นความจริงทางประวัติศาสตร์หรือไม่ แต่ Fortran รู้สึกว่ามันถูกสร้างขึ้นเพื่อเป็นคู่ขนาน / กระจาย / เวกเตอร์ / อะไรก็ตามที่มีหลายแกน และวันนี้มันเป็น "ตัวชี้วัดมาตรฐาน" สวยมากเมื่อเราพูดถึงความเร็ว: "มันปรับขนาดได้หรือไม่"

สำหรับซีพียูที่บดตัวฉันรัก Fortran สำหรับทุกสิ่งที่เกี่ยวข้องกับ IO ฉันพบว่าการทำงานกับ C. ง่ายขึ้น (มันยากทั้งสองกรณี)

แน่นอนว่าสำหรับรหัสเข้มข้นคณิตศาสตร์ขนานคุณอาจต้องการใช้ GPU ของคุณ ทั้ง C และ Fortran มีอินเทอร์เฟซ CUDA / OpenCL ที่รวมกันมากหรือน้อย (และตอนนี้ OpenACC)

คำตอบที่เป็นกลางปานกลางของฉันคือ: ถ้าคุณรู้ว่าทั้งสองภาษาเท่าเทียมกัน / ไม่ดีฉันคิดว่า Fortran เร็วกว่าเพราะฉันคิดว่าการเขียนโค้ดขนาน / กระจายใน Fortran ง่ายกว่า C. (เมื่อคุณเข้าใจว่าคุณสามารถเขียน "อิสระ" Fortran และ ไม่ใช่รหัส F77 ที่เข้มงวดเท่านั้น)

นี่คือคำตอบที่ 2 สำหรับผู้ที่ต้องการ downvote ฉันเพราะพวกเขาไม่ชอบคำตอบที่ 1: ทั้งสองภาษามีคุณสมบัติที่จำเป็นในการเขียนโค้ดประสิทธิภาพสูง ดังนั้นมันจึงขึ้นอยู่กับอัลกอริธึมที่คุณใช้ (ซีพียูเข้มข้นไอโอไอเข้มข้นหน่วยความจำมาก) ฮาร์ดแวร์ (ซีพียูหลายแกนเดี่ยวกระจายซูเปอร์คอมพิวเตอร์ GPGPU? FPGA?) ทักษะของคุณและตัวแปลเองในที่สุด ทั้ง C และ Fortran มีคอมไพเลอร์ที่ยอดเยี่ยม (ฉันประหลาดใจอย่างจริงจังกับวิธีคอมไพเลอร์ Fortran ขั้นสูง แต่เป็นคอมไพเลอร์ C)

PS: ฉันดีใจที่คุณยกเว้น libs โดยเฉพาะเพราะฉันมีเรื่องเลวร้ายมากมายที่จะพูดเกี่ยวกับ Fortran GUI libs :)


11

ฉันกำลังทำคณิตศาสตร์อย่างกว้างขวางกับ FORTRAN และ C เป็นเวลาสองปี จากประสบการณ์ของฉันเองฉันสามารถบอกได้ว่า FORTRAN บางครั้งดีกว่า C แต่ไม่ใช่สำหรับความเร็ว (หนึ่งสามารถทำให้ C ทำงานเร็วเท่ากับ FORTRAN โดยใช้รูปแบบการเข้ารหัสที่เหมาะสม) แต่เนื่องจากห้องสมุดที่ได้รับการปรับให้เหมาะสมเช่น LAPACK และเพราะ การขนานที่ดี จากความเห็นของฉันฟอร์แทรนนั้นอึดอัดใจที่จะทำงานด้วยและข้อดีของมันก็ไม่ดีพอที่จะยกเลิกข้อเสียนั้นดังนั้นตอนนี้ฉันจึงใช้ C + GSL เพื่อทำการคำนวณ


10

ความแตกต่างของความเร็วระหว่าง Fortran และ C จะเป็นฟังก์ชั่นการเพิ่มประสิทธิภาพคอมไพเลอร์และไลบรารีคณิตศาสตร์พื้นฐานที่ใช้โดยคอมไพเลอร์โดยเฉพาะ ไม่มีสิ่งใดใน Fortran ที่จะทำให้เร็วกว่า C

อย่างไรก็ตามโปรแกรมเมอร์ที่ดีสามารถเขียน Fortran ในภาษาใดก็ได้


@Scott Clawson: คุณได้ -1 แล้วและฉันไม่รู้ว่าทำไม +1 เพื่อแก้ไขปัญหานี้ อย่างไรก็ตามสิ่งที่ต้องคำนึงถึงก็คือ Fortran นั้นมีความยาวกว่าผู้ปกครองของเราหลายคน ใช้เวลาจำนวนมากในการปรับแต่งคอมไพเลอร์เอาท์พุท: D
user7116

ฉันเห็นด้วย. ฉันเพิ่งโพสต์คำตอบที่คล้ายกันมากในแบบคู่ขนาน
เจฟฟ์ Tall

ปัญหานามแฝงตัวชี้ใน C ได้รับการเลี้ยงดูจากผู้อื่น แต่มีหลายวิธีที่โปรแกรมเมอร์สามารถใช้กับคอมไพเลอร์สมัยใหม่เพื่อจัดการกับสิ่งนั้นดังนั้นฉันจึงยังเห็นด้วย
เจฟฟ์ Tall

1
@Kluge: "ไม่มีอะไรที่แท้จริงที่ Fortran จะทำให้เร็วกว่า C" นามแฝงของตัวชี้, คืนค่าสารประกอบในรีจิสเตอร์, สร้างตัวเลขในระดับที่สูงกว่า ...
Jon Harrop

9

ฉันไม่เคยได้ยินมาก่อนเลยว่า Fortan นั้นเร็วกว่า C มาก แต่มันอาจเป็นไปได้ในบางกรณีมันจะเร็วขึ้น และที่สำคัญไม่ได้อยู่ในคุณสมบัติภาษาที่มีอยู่ แต่ในที่ที่ขาด (ปกติ)

ตัวอย่างคือตัวชี้ C พอยน์เตอร์ C ถูกใช้งานอยู่ทุกหนทุกแห่ง แต่ปัญหาของพอยน์เตอร์ก็คือคอมไพเลอร์มักไม่สามารถบอกได้ว่าพวกมันชี้ไปยังส่วนต่าง ๆ ของอาเรย์เดียวกันหรือไม่

ตัวอย่างเช่นถ้าคุณเขียนชุดคำสั่ง strcpy ที่มีลักษณะเช่นนี้:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

คอมไพเลอร์ต้องทำงานภายใต้สมมติฐานว่า d และ s อาจมีการทับซ้อนกันของอาร์เรย์ ดังนั้นจึงไม่สามารถทำการปรับให้เหมาะสมที่จะให้ผลลัพธ์ที่แตกต่างเมื่ออาร์เรย์ทับซ้อนกัน ตามที่คุณคาดหวังสิ่งนี้จะ จำกัด ประเภทการเพิ่มประสิทธิภาพที่สามารถทำได้

[ฉันควรทราบว่า C99 มีคำหลัก "จำกัด " ที่จะบอกคอมไพเลอร์อย่างชัดเจนว่าพอยน์เตอร์ไม่ทับซ้อนกัน นอกจากนี้โปรดทราบว่า Fortran ก็มีพอยน์เตอร์ด้วยซึ่งมีความหมายแตกต่างจาก C แต่พอยน์เตอร์นั้นไม่แพร่หลายเหมือนใน C]

แต่กลับมาที่ปัญหา C vs. Fortran เป็นไปได้ว่าคอมไพเลอร์ Fortran สามารถทำการปรับแต่งบางอย่างที่อาจเป็นไปไม่ได้สำหรับโปรแกรม C (เขียนอย่างตรงไปตรงมา) ดังนั้นฉันจะไม่แปลกใจกับการเรียกร้อง อย่างไรก็ตามฉันคาดหวังว่าความแตกต่างของประสิทธิภาพจะไม่มากนัก [~ 5-10%]


9

รวดเร็วและเรียบง่าย: ทั้งสองอย่างรวดเร็วเท่าเทียมกัน แต่ Fortran ง่ายกว่า ในที่สุดสิ่งที่เร็วกว่าจริงๆขึ้นอยู่กับอัลกอริทึม แต่ก็ไม่มีความแตกต่างด้านความเร็วเลย นี่คือสิ่งที่ฉันเรียนรู้จากการประชุมเชิงปฏิบัติการ Fortran ที่ศูนย์คอมพิวเตอร์ประสิทธิภาพสูง Stuttgard ประเทศเยอรมนีในปี 2558 ฉันทำงานกับ Fortran และ C และแบ่งปันความคิดเห็นนี้

คำอธิบาย:

C ถูกออกแบบมาเพื่อเขียนระบบปฏิบัติการ ดังนั้นจึงมีอิสระมากกว่าที่จำเป็นในการเขียนโค้ดประสิทธิภาพสูง โดยทั่วไปนี่จะไม่มีปัญหา แต่ถ้าไม่มีโปรแกรมอย่างระมัดระวังหนึ่งสามารถช้าลงรหัส

Fortran ถูกออกแบบมาสำหรับการเขียนโปรแกรมทางวิทยาศาสตร์ ด้วยเหตุนี้มันจึงรองรับการเขียนรหัสอย่างรวดเร็วเนื่องจากเป็นจุดประสงค์หลักของ Fortran ตรงกันข้ามกับความคิดเห็นสาธารณะ Fortran ไม่ใช่ภาษาโปรแกรมที่ล้าสมัย มาตรฐานล่าสุดคือ 2010 และคอมไพเลอร์ใหม่จะเผยแพร่เป็นประจำเนื่องจากรหัสประสิทธิภาพสูงส่วนใหญ่เขียนใน Fortran Fortran ยังสนับสนุนคุณสมบัติที่ทันสมัยในฐานะคอมไพเลอร์คำสั่ง (ใน C pragmas)

ตัวอย่าง: เราต้องการให้โครงสร้างขนาดใหญ่เป็นอาร์กิวเมนต์อินพุตให้กับฟังก์ชัน (fortran: รูทีนย่อย) ภายในฟังก์ชั่นการโต้แย้งจะไม่เปลี่ยนแปลง

C รองรับทั้งโทร, อ้างอิงและโทรตามค่าซึ่งเป็นคุณสมบัติที่มีประโยชน์ ในกรณีของเราโปรแกรมเมอร์อาจใช้การโทรโดยบังเอิญ สิ่งนี้จะช้าลงอย่างมากเนื่องจากโครงสร้างจะต้องคัดลอกภายในหน่วยความจำก่อน

Fortran ทำงานร่วมกับการโทรโดยการอ้างอิงเท่านั้นซึ่งบังคับให้โปรแกรมเมอร์ทำการคัดลอก struct ด้วยมือถ้าเขาต้องการการโทรตามการดำเนินการค่าจริง ๆ ในกรณีของเรา fortran จะเป็นแบบอัตโนมัติเร็วเท่ากับรุ่น C พร้อมการโทรโดยการอ้างอิง


คุณสามารถเขียนแอปพลิเคชันแบบขนานดั้งเดิมใน C (หมายถึงโดยไม่ต้องเรียกไลบรารีใด ๆ ได้หรือไม่) ไม่ได้คุณสามารถเขียนแอปพลิเคชันแบบขนานดั้งเดิมใน Fortran ได้หรือไม่ ได้หลายวิธี เออร์โก Fortran เป็น "เร็วขึ้น" แม้ว่าจะมีความยุติธรรมในปี 2010 เมื่อคุณเขียนความคิดเห็นของคุณการสนับสนุนคุณสมบัติการทำงานแบบขนานและแบบร่วมของ Fortran นั้นอาจไม่แพร่หลายเท่าที่ควร
Mali Remorker

@MaliRemorker เขาเขียนสิ่งนี้ในปี 2559 ไม่ใช่ในปี 2010
Kowalski

ค่าใช้จ่ายในการสร้างกระบวนการแบบขนานอยู่ในความคิดของฉันไม่ใช่ปัจจัยที่เกี่ยวข้องมากที่สุดสำหรับภาษาการเขียนโปรแกรมที่เรียกว่า 'เร็ว' สิ่งที่เกี่ยวข้องมากกว่านั้นคือข้อควรพิจารณาในทางปฏิบัติเช่นความสงบสุขของโค้ดที่ไม่มีประสิทธิภาพ ดังนั้นจึงไม่ช่วยอะไรเลยถ้าคุณประหยัดเวลาเพียงครั้งเดียว (เมื่อสร้างกระบวนการแบบขนาน) และเสียเวลาในหลายคอร์ในภายหลัง คำว่า 'เร็ว' ควรพิจารณารหัสที่ไม่ขนานกัน ด้วยเหตุนี้ฉันจึงไม่เห็นข้อโต้แย้งกับประเด็นของฉัน บางทีความคิดเห็นของคุณอาจเป็นคำตอบที่เป็นอิสระ?
Markus Dutschke

8

โดยทั่วไปแล้ว FORTRAN ช้ากว่า C. C สามารถใช้ตัวชี้ระดับฮาร์ดแวร์เพื่อให้โปรแกรมเมอร์ปรับใช้มือให้เหมาะสม FORTRAN (ในกรณีส่วนใหญ่) ไม่สามารถเข้าถึงการแฮ็กแอดเดรสของหน่วยความจำฮาร์ดแวร์ (VAX FORTRAN เป็นอีกเรื่องหนึ่ง) ฉันใช้ FORTRAN เปิดและปิดนับตั้งแต่ยุค 70 (จริงๆ.)

อย่างไรก็ตามการเริ่มต้นใน FORTRAN ของยุค 90 ได้พัฒนาขึ้นเพื่อรวมโครงสร้างภาษาเฉพาะที่สามารถปรับให้เป็นอัลกอริธึมแบบขนานโดยเนื้อแท้ที่สามารถส่งเสียงร้องบนโปรเซสเซอร์แบบมัลติคอร์ได้ ยกตัวอย่างเช่น Vectorizing อัตโนมัติช่วยให้โปรเซสเซอร์หลายตัวจัดการแต่ละองค์ประกอบในเวกเตอร์ของข้อมูลพร้อมกัน 16 โปรเซสเซอร์ - 16 องค์ประกอบเวกเตอร์ - การประมวลผลใช้เวลา 1 / 16th เวลา

ใน C คุณต้องจัดการเธรดของคุณเองและออกแบบอัลกอริธึมของคุณอย่างรอบคอบสำหรับการประมวลผลหลายอย่างจากนั้นใช้การเรียก API จำนวนมากเพื่อให้แน่ใจว่าการขนานนั้นเกิดขึ้นอย่างถูกต้อง

ใน FORTRAN คุณจะต้องออกแบบอัลกอริทึมของคุณอย่างระมัดระวังสำหรับการประมวลผลหลายอย่าง คอมไพเลอร์และเวลาทำงานสามารถจัดการส่วนที่เหลือให้คุณได้

คุณสามารถอ่านเล็กน้อยเกี่ยวกับFortran ประสิทธิภาพสูงแต่คุณพบลิงค์จำนวนมาก คุณควรอ่านเกี่ยวกับการเขียนโปรแกรมแบบขนาน (เช่นOpenMP.org ) และวิธีที่ FORTRAN ให้การสนับสนุน


6
@ S.Lott: ฉันไม่สามารถจินตนาการได้ว่ารหัส C ที่น่ากลัวจะต้องทำยังไงดีเหมือนกับเขียน Fortran สำหรับรหัสส่วนใหญ่ที่เรามีที่นี่ ... และฉันเป็นโปรแกรมเมอร์ C คุณจะได้ประสิทธิภาพที่ดีขึ้นจากรหัสที่ง่ายกว่าใน Fortran ไม่ใช่ว่าคุณหรือฉันไม่สามารถหาตัวอย่างตัวอย่างได้ : D
user7116

2
@ Greg Rogers: คุณจะต้องจัดการปัญหาของคุณกับคน Fortran Vectorization ไม่ใช่ฉัน ฉันแค่รายงานสิ่งที่ฉันอ่าน polyhedron.com/absoftlinux
S.Lott

2
-1 // "โดยทั่วไป FORTRAN ช้ากว่า C. สิ่งนี้เป็นจริงสำหรับเกือบทุกอย่าง" ทำไม? // ข้อโต้แย้งที่อิงกับความสะดวกในการใช้มัลติเธรดใน Fortran vs C ไม่ได้พูดอะไรเกี่ยวกับประสิทธิภาพ
steabert

4
@ S.Lott: "มีหลายเธรดเพื่อประสิทธิภาพเท่านั้น" เอ่อไม่มี
Jon Harrop

4
@ S.Lott: "การใช้ตัวชี้ของ C เกือบระดับฮาร์ดแวร์ทำให้ C เร็วกว่า Fortran" เอ่อไม่มี
Jon Harrop

5

โค้ดที่เร็วกว่านั้นไม่ได้ขึ้นอยู่กับภาษานั้นจริงๆคือคอมไพเลอร์ดังนั้นคุณสามารถเห็น ms-vb "คอมไพเลอร์" ที่สร้างโค้ดออบเจ็กต์ที่ช้าลงและซ้ำซ้อนที่ผูกเข้าด้วยกันใน ".exe" แต่ powerBasic รหัสที่ดีกว่า รหัสวัตถุที่สร้างโดยคอมไพเลอร์ C และ C ++ นั้นถูกสร้างขึ้นในบางเฟส (อย่างน้อย 2) แต่โดยการออกแบบคอมไพเลอร์ Fortran ส่วนใหญ่มีอย่างน้อย 5 เฟสรวมถึงการปรับให้เหมาะสมในระดับสูงดังนั้นโดยการออกแบบ Fortran จะมีความสามารถ ดังนั้นท้ายที่สุดก็คือคอมไพเลอร์ไม่ใช่ภาษาที่คุณควรถามคอมไพเลอร์ที่ดีที่สุดที่ฉันรู้คือ Intel Fortran Compiler เพราะคุณสามารถหาได้จาก LINUX และ Windows และคุณสามารถใช้ VS เป็น IDE ได้หากคุณกำลังมองหา คอมไพเลอร์ tigh ราคาถูกคุณสามารถถ่ายทอดบน OpenWatcom ได้ตลอดเวลา

ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html


3

Fortran มีรูทีน I / O ที่ดีขึ้นเช่นสิ่งอำนวยความสะดวกการทำโดยนัยให้ความยืดหยุ่นที่ไลบรารีมาตรฐานของ C ไม่สามารถจับคู่ได้

คอมไพเลอร์ Fortran จัดการกับไวยากรณ์ที่ซับซ้อนมากขึ้นที่เกี่ยวข้องโดยตรงและเป็นไวยากรณ์ดังกล่าวไม่สามารถลดได้อย่างง่ายดายเพื่อโต้แย้งผ่านแบบฟอร์ม C ไม่สามารถใช้งานได้อย่างมีประสิทธิภาพ


1
คุณมีเกณฑ์มาตรฐานที่แสดง Fortran เต้น C สำหรับ I / O หรือไม่?
Jeff

3

ใช้มาตรฐานที่ทันสมัยและเรียบเรียงไม่ใช่!

บางคนที่นี่แนะนำว่า FORTRAN นั้นเร็วกว่าเพราะคอมไพเลอร์ไม่จำเป็นต้องกังวลเกี่ยวกับนามแฝง (และสามารถสร้างสมมติฐานเพิ่มเติมในระหว่างการปรับให้เหมาะสม) อย่างไรก็ตามสิ่งนี้ได้รับการจัดการใน C ตั้งแต่มาตรฐาน C99 (ฉันคิดว่า) ด้วยการรวมคำหลัก จำกัด ซึ่งโดยทั่วไปจะบอกคอมไพเลอร์ว่าภายในขอบเขตให้ตัวชี้ไม่ได้เป็นนามแฝง นอกจากนี้ C ช่วยให้การคำนวณทางคณิตศาสตร์ที่เหมาะสมซึ่งสิ่งต่าง ๆ เช่นนามแฝงจะมีประโยชน์มากในแง่ของประสิทธิภาพและการจัดสรรทรัพยากร แม้ว่าฉันคิดว่า FORTRAN รุ่นล่าสุดจะเปิดใช้งานตัวชี้ "ที่เหมาะสม"

สำหรับการใช้งานที่ทันสมัย ​​C ทั่วไปมีประสิทธิภาพสูงกว่า FORTRAN (แม้ว่าจะเร็วเกินไป)

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

แก้ไข:

การวิจารณ์อย่างยุติธรรมเกี่ยวกับเรื่องนี้น่าจะเป็นไปได้ว่าการเปรียบเทียบอาจจะลำเอียง นี่คือแหล่งข้อมูลอื่น (สัมพันธ์กับ C) ที่ทำให้ผลลัพธ์มีบริบทมากขึ้น:

http://julialang.org/benchmarks/

คุณจะเห็นได้ว่า C มักจะมีประสิทธิภาพเหนือกว่า Fortran ในกรณีส่วนใหญ่ (ดูคำวิจารณ์ด้านล่างที่เกี่ยวข้องที่นี่ด้วย) ดังที่คนอื่น ๆ ระบุไว้การเปรียบเทียบเป็นวิทยาศาสตร์ที่ไม่แน่นอนซึ่งสามารถโหลดได้ง่ายเพื่อให้ความนิยมกับภาษาอื่นมากกว่าภาษาอื่น แต่ในบริบทที่ Fortran และ C มีประสิทธิภาพใกล้เคียงกัน


3
หนึ่งอาจเป็นคนโง่ที่เชื่ออะไรเกี่ยวกับ Fortran จากโพสต์ที่ถือว่ายังคงเป็น FORTRAN มันเปลี่ยนไปมากว่า 25 ปีแล้ว การทดสอบเหล่านั้นไม่สามารถเปรียบเทียบภาษาได้เนื่องจากใช้คอมไพเลอร์จากผู้ขายหลายรายทั้ง Intel และ GCC มีคอมไพเลอร์สำหรับทั้ง C และ Fortran ดังนั้นการเปรียบเทียบเหล่านั้นจึงไร้ค่า
วลาดิมีร์ F

2

Fortran สามารถจัดการอาเรย์โดยเฉพาะอาเรย์หลายมิติได้อย่างสะดวก องค์ประกอบการแบ่งของอาร์เรย์หลายมิติใน Fortran สามารถทำได้ง่ายกว่าใน C / C ++ ตอนนี้ C ++ มีไลบรารีที่สามารถทำงานได้เช่น Boost หรือ Eigen แต่จะอยู่หลังไลบรารี่ภายนอกทั้งหมด ใน Fortran ฟังก์ชั่นเหล่านี้มีอยู่จริง

Fortran นั้นเร็วกว่าหรือสะดวกกว่าสำหรับการพัฒนาส่วนใหญ่ขึ้นอยู่กับงานที่คุณต้องทำให้เสร็จ ในฐานะบุคคลคำนวณทางวิทยาศาสตร์สำหรับธรณีฟิสิกส์ฉันได้ทำการคำนวณส่วนใหญ่ใน Fortran (ฉันหมายถึง Fortran ที่ทันสมัย,> = F90)


1
และยังขึ้นอยู่กับว่า Fortran นั้นเร็วกว่าหรือไม่นั้นขึ้นอยู่กับ: คอมไพเลอร์ที่คุณใช้ (สำคัญ!) สำหรับงานการคำนวณไม่ว่าคุณจะใช้การขนานที่เหมาะสมกับโค้ดหรือไม่และการเขียนโค้ดของคุณเป็นอย่างไร
Kai

1

นี่เป็นอะไรที่มากกว่าความคิดส่วนตัวเพราะมันมีคุณภาพของคอมไพเลอร์และมากกว่าสิ่งอื่นใด อย่างไรก็ตามเพื่อตอบคำถามของคุณโดยตรงมากกว่าการพูดจากมุมมองของภาษา / คอมไพเลอร์ไม่มีอะไรเกี่ยวกับ Fortran เหนือ C ที่จะทำให้มันเร็วขึ้นหรือดีกว่า C โดยธรรมชาติถ้าคุณกำลังดำเนินการทางคณิตศาสตร์อย่างหนักมันจะลงมาที่ คุณภาพของคอมไพเลอร์, ความสามารถของโปรแกรมเมอร์ในแต่ละภาษาและไลบรารีสนับสนุนคณิตศาสตร์ที่แท้จริงซึ่งสนับสนุนการดำเนินการเหล่านั้นในท้ายที่สุดเพื่อกำหนดว่าสิ่งใดจะเร็วขึ้นสำหรับการนำไปปฏิบัติ

แก้ไข: คนอื่น ๆ เช่น @Nils ได้ยกประเด็นที่ดีเกี่ยวกับความแตกต่างในการใช้งานพอยน์เตอร์ใน C และความเป็นไปได้สำหรับนามแฝงที่อาจทำให้การใช้งานไร้เดียงสาช้าที่สุดใน C อย่างไรก็ตามมีวิธีจัดการกับ C99 ผ่านการปรับให้เหมาะสมของคอมไพเลอร์และ / หรือวิธีการเขียน C จริงๆ สิ่งนี้ได้รับการครอบคลุมอย่างดีใน @Nils คำตอบและความคิดเห็นที่ตามมาที่ติดตามคำตอบของเขา


ดูเหมือนว่าการทดสอบเกณฑ์มาตรฐานของอัลกอริทึม ซึ่งใช้เวลาน้อยกว่า FORTRAN หรือ C ไม่ฟังความรู้สึกส่วนตัวของฉัน บางทีฉันอาจจะพลาดอะไรซักอย่าง
S.Lott

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

นี่ไม่ใช่การวิเคราะห์ O (n) ของอัลกอริทึม มันเป็นประสิทธิภาพ ไม่เห็นว่าประสิทธิภาพการทำงานอาจเป็นแนวคิดที่ไม่ขึ้นอยู่กับการใช้งานจริง เดาว่าฉันขาดอะไรไป
S.Lott

1
-1: "ไม่มีอะไรเกี่ยวกับ Fortran เหนือ C ที่จะทำให้เร็วขึ้นหรือดีกว่า C โดยธรรมชาติ" เอ่อไม่มี
Jon Harrop

0

โพสต์ส่วนใหญ่มีข้อโต้แย้งที่น่าสนใจอยู่แล้วดังนั้นฉันจะเพิ่มสุภาษิต 2 เซ็นต์ลงในอีกแง่มุมหนึ่ง

การเป็น Fortran เร็วขึ้นหรือช้าลงในแง่ของพลังการประมวลผลในตอนท้ายอาจมีความสำคัญ แต่ถ้าใช้เวลามากกว่า 5 ครั้งในการพัฒนาบางสิ่งใน Fortran เพราะ:

  • มันไม่มีไลบรารี่ที่ดีสำหรับงานที่แตกต่างจากการบีบหมายเลขบริสุทธิ์
  • ไม่มีเครื่องมือที่เหมาะสมสำหรับการทำเอกสารและการทดสอบหน่วย
  • มันเป็นภาษาที่มีการแสดงออกน้อยมากทำให้จำนวนของโค้ดเพิ่มขึ้นอย่างรวดเร็ว
  • มันมีการจัดการสตริงที่ไม่ดีมาก
  • มันมีปัญหาที่โง่เขลาในคอมไพเลอร์และสถาปัตยกรรมที่ต่างกันทำให้คุณคลั่งไคล้
  • มันมีกลยุทธ์ IO ที่แย่มาก (อ่าน / เขียนไฟล์ตามลำดับใช่มีไฟล์การเข้าถึงแบบสุ่มอยู่ แต่คุณเคยเห็นพวกเขาเคยใช้หรือไม่?)
  • มันไม่สนับสนุนการพัฒนาที่ดีการทำให้เป็นโมดูล
  • การขาดประสิทธิภาพของคอมไพเลอร์โอเพ่นซอร์สที่ได้มาตรฐานและครบถ้วน (ทั้ง gfortran และ g95 ไม่สนับสนุนทุกอย่าง)
  • การทำงานร่วมกันที่แย่มากกับ C (mangling: หนึ่งขีดล่าง, สองขีดล่าง, ไม่ขีดล่าง, โดยทั่วไปขีดล่างหนึ่ง แต่สองถ้ามีขีดล่างอีกอันหนึ่งและปล่อยให้ไม่เจาะเข้าไปในบล็อกทั่วไป ... )

จากนั้นปัญหาไม่เกี่ยวข้อง หากบางสิ่งบางอย่างช้าส่วนใหญ่คุณไม่สามารถปรับปรุงได้เกินขีด จำกัด ที่กำหนด หากคุณต้องการบางสิ่งที่เร็วขึ้นให้เปลี่ยนอัลกอริทึม ในท้ายที่สุดเวลาคอมพิวเตอร์ราคาถูก เวลาของมนุษย์ไม่ใช่ ให้ความสำคัญกับทางเลือกที่ช่วยลดเวลาของมนุษย์ หากเพิ่มเวลาคอมพิวเตอร์ก็จะคุ้มค่าอยู่ดี


3
downvoted เพราะแม้ว่าคุณจะเพิ่มคะแนนที่น่าสนใจซึ่งเพิ่มไปยังการอภิปรายเกี่ยวกับผลประโยชน์ / ข้อเสีย fortrans เมื่อเทียบกับภาษาอื่น ๆ (ซึ่งฉันไม่เห็นด้วยอย่างสมบูรณ์) นี่ไม่ใช่คำตอบสำหรับคำถามจริงๆ ...
steabert

@steabert: ในความเป็นจริงฉันพูดI will just add the proverbial 2 cents to a different aspect
Stefano Borini

1
+1 จากฉันสำหรับคำตอบที่ไม่ต้องการ ดังที่คุณพูด Fortran อาจทำงานได้เร็วขึ้นในบางงานที่หายาก (ไม่ได้เห็นเป็นการส่วนตัว) แต่ระยะเวลาที่คุณเสียไปสำหรับการบำรุงรักษาซากปรักหักพังทางภาษานั้นไม่ได้เปรียบเท่าที่ควร
André Bergner

10
-1 คุณดูเหมือนจะคิดถึง Fortran ในแง่ของ F77 นั่นถูกแทนที่โดย F90, F95, F03 และ F08
Kyle Kanos

4
ลดลงเพราะพูดถึงเฉพาะด้านเดียวของการแลกเปลี่ยน ความเร็วในการพัฒนาอาจมีความสำคัญสำหรับการเขียนโปรแกรมทั่วไปส่วนใหญ่ แต่นั่นไม่ได้ทำให้เป็นการแลกเปลี่ยนที่ถูกต้องเท่านั้น โปรแกรมเมอร์ Fortran มักจะเป็นนักวิทยาศาสตร์ / วิศวกรที่เห็นคุณค่าของความเรียบง่ายของภาษา (FORmula TRANslation เป็นเรื่องง่ายมากที่จะเรียนรู้และเป็นผู้เชี่ยวชาญ C / C ++ ไม่ได้ ), ห้องสมุดที่ยอดเยี่ยม (มักใช้จากภาษาอื่น) และความเร็ว (เช่นการจำลองสภาพอากาศ ที่ใช้เวลาเป็นวันใน Fortran แต่เป็นเดือนถ้าเขียนเป็นภาษาอื่นทั้งหมด)
BraveNewCurrency

-3

Fortran ตามเนื้อผ้าไม่ได้ตั้งค่าตัวเลือกเช่น -fp: เข้มงวด (ซึ่ง ifort ต้องการเปิดใช้งานคุณลักษณะบางอย่างใน USE IEEE_arithmetic ซึ่งเป็นส่วนหนึ่งของมาตรฐาน f2003) Intel C ++ ยังไม่ได้ตั้งค่า -fp: เข้มงวดเป็นค่าเริ่มต้น แต่จำเป็นสำหรับการจัดการ ERRNO และคอมไพเลอร์ C ++ อื่น ๆ ไม่สะดวกที่จะปิด ERRNO หรือเพิ่มประสิทธิภาพเช่นการลด Simd gcc และ g ++ ทำให้ฉันต้องตั้งค่า Makefile เพื่อหลีกเลี่ยงการใช้ชุดค่าผสมที่เป็นอันตราย -O3 -ffast-math -fopenmp -march = native นอกเหนือจากปัญหาเหล่านี้คำถามเกี่ยวกับประสิทธิภาพสัมพัทธ์ได้รับ nit-picky มากขึ้นและขึ้นอยู่กับกฎท้องถิ่นเกี่ยวกับการเลือกคอมไพเลอร์และตัวเลือก


การอัปเดต gcc ล่าสุดแก้ไขปัญหาด้วยการรวมกันของ Openmp และคณิตศาสตร์อย่างรวดเร็ว
tim18

คำตอบนี้เป็นเรื่องเกี่ยวกับผู้ใช้ที่ไม่เข้าใจค่าสถานะเริ่มต้นสำหรับคอมไพเลอร์ไม่ใช่ภาษาเอง
Jeff
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.