อะไรทำให้ Fortran เร็ว


41

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

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


7
ฉันจะบอกว่านี่อาจเป็นคำถามที่ดีกว่าสำหรับ stackoverflow แม้ว่าฉันจะเป็นคำถามที่ดีก็ตาม การค้นหาด่วน ( stackoverflow.com/search?q=fortran+fast ) นำฉันไปสู่คำถามนี้ที่อาจช่วยคุณได้: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
คุณต้องระบุประเภทของ Fortran ที่คุณใช้ มีความแตกต่างอย่างมากระหว่าง 77 และ 90+ ฉันสมมติว่าอย่างน้อย 90 ถ้าเรากำลังพูดคุยเกี่ยวกับตัวชี้ ...
qubyte

ฉันมักจะอ่านเกี่ยวกับ Fortran ที่เร็วกว่า C. บางทีอาจจะ แต่เร็วกว่าเช่น 2% หรือเร็วกว่าเช่น 50% หรือไม่
shuhalo

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

คำตอบ:


50

นักออกแบบภาษาต้องเผชิญกับทางเลือกมากมาย Ken Kennedyเน้นสอง: (1) abstractions ที่ดีกว่าและ (2) สูงกว่าหรือต่ำกว่า (เหมือนเครื่องจักรน้อยกว่า) ในขณะที่ภาษาที่ใช้งานได้เช่น Haskell และ Scheme มุ่งเน้นไปที่ภาษาคอมพิวเตอร์เชิงวิทยาศาสตร์แบบดั้งเดิมเช่น Fortran และ C / C ++ ให้ความสำคัญกับภาษาหลัง การพูดว่าภาษาหนึ่งเร็วกว่าอีกภาษาหนึ่งมักจะทำให้เข้าใจผิดค่อนข้างมาก: แต่ละภาษามีโดเมนปัญหาที่ทำให้ภาษาดีขึ้น Fortran อัตราค่าโดยสารที่ดีขึ้นในโดเมนของรหัสตัวเลขตามอาเรย์กว่าภาษาอื่น ๆ ด้วยเหตุผลพื้นฐานสองประการ: โมเดลอาเรย์และความชัดเจนของมัน

Array Model

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

ความชัดเจนทางภาษา

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

Fortran สามารถช้า

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


7
ปัญหา GUI / IO สามารถแก้ไขได้อย่างง่ายดายโดยห่อ Fortran crunching ในภาษา "วัตถุประสงค์ทั่วไปมากขึ้น" ฉันมักจะใช้ R เพื่อจุดประสงค์นี้
mbq

2
shootout.alioth.debian.orgไม่สามารถใช้ได้อีก! และเวอร์ชั่นใหม่มีข้อมูลน้อยกว่ามาก :(
astrojuanlu

23

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

ตัวอย่างหนึ่งที่มีชื่อเสียงเป็นที่จัดการของaliasing ใน Fortran คุณสามารถเข้าถึงพื้นที่หน่วยความจำเฉพาะได้เฉพาะสัญลักษณ์ที่เกี่ยวข้องกับพื้นที่หน่วยความจำนั้นเท่านั้น ความรู้นี้ช่วยให้คอมไพเลอร์ใช้สมาร์ททริคเมื่อถึงเวลาที่จะแคช: มันรู้ว่าค่าอาจมีการเปลี่ยนแปลงหรือไม่ จนกระทั่งถึง F90 สิ่งนี้ได้รับการยืนยันอย่างง่ายดาย เมื่อ Fortran 90 นำมาpointersใช้ข้อสันนิษฐานไม่เป็นความจริงอีกต่อไป: คุณสามารถเข้าถึงพื้นที่หน่วยความจำเดียวกันผ่านสัญลักษณ์สอง (หรือมากกว่า) นี่คือเหตุผลที่คุณต้องระบุtargetให้กับอาร์เรย์ที่คุณต้องการที่อยู่ผ่านพอยน์เตอร์

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

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

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


2
เมื่อคอมพิวเตอร์ของคุณเข้าสู่ช่วง> $ 100 ล้านคนเวลา (นักเรียนระดับบัณฑิตศึกษา) หยุดดูค่อนข้างแพงเมื่อเปรียบเทียบ
Phil Miller

6
@Novelocrat: จำนวนของรหัสที่ทำงานบนคอมพิวเตอร์$ 100 ล้านได้ถูกเขียนโดยจำนวนชั่วโมงที่ไม่สามารถนับได้ซึ่งเกินกว่าเครื่องหมาย$ 100 ล้านแม้แต่ราคานักเรียน โปรดจำไว้ว่าค่าใช้จ่ายของบุคคลคือสองเท่าของรายได้ ส่วนที่เหลือจะรวมภาษีและมีความสัมพันธ์กัน นอกจากนี้คอมพิวเตอร์ไม่ประสบกับความเหนื่อยล้า คนทำและจะเปลี่ยนงาน
Stefano Borini

1
@StefanoBorini ฉันมีประวัติอันยาวนานของพีซีที่ประสบปัญหา ...
N74

1
"นอกจากนี้โปรดจำไว้ว่าไม่มีใครใช้ Fortran วันนี้ยกเว้นการคำนวณเชิงตัวเลข" Fortran = "FORmula TRANslation" Fortran นั้นถูกใช้และออกแบบมาเพื่อการคำนวณเชิงตัวเลขเป็นหลัก Fortran มีส่วนแบ่งขนาดใหญ่ของเวลาของคอมพิวเตอร์ประสิทธิภาพสูง
user21387

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

12

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

นอกจากนี้ยังมีปัจจัยความเฉื่อยขนาดใหญ่ รหัสตัวเลขจำนวนมากอยู่ใน Fortran ดังนั้นผู้สร้างเซิร์ฟเวอร์ระดับสูงและซูเปอร์คอมพิวเตอร์ทำให้แน่ใจว่าพวกเขาเขียนคอมไพเลอร์ของ Fortran ที่ปรับแต่งได้ดี คอมไพเลอร์นั้นดี (แม้ในเครื่องที่ไม่มีคอมไพเลอร์คุณภาพสูง) ดังนั้นผู้ใช้ยังคงใช้ Fortran และแม้แต่เขียนโค้ดใหม่ลงไป ดังนั้นผู้สร้างทำให้แน่ใจว่าคนรุ่นต่อไปมีคอมไพเลอร์ที่ดี ฯลฯ ...


8

ระวังตำนานเมืองที่นี่ หากคอมไพเลอร์สองตัวสร้างรหัสแอสเซมบลีเดียวกันจากนั้นโปรแกรมผลลัพธ์จะมีประสิทธิภาพเหมือนกัน

สำหรับชิ้นส่วนของตรรกะใด ๆ ที่กำหนดมีโปรแกรมในภาษาแอสเซมบลีที่ลดเวลาดำเนินการ โปรแกรมนั้นไม่สนใจว่าจะสร้างคอมไพเลอร์ใด

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

แต่นอกเหนือจากนั้นฉันไม่เคยเห็นโปรแกรมที่เขียนขึ้นครั้งแรกไม่มีห้องสำคัญสำหรับการปรับปรุงประสิทธิภาพของชนิดที่คอมไพเลอร์ไม่สามารถทำความสะอาดสำหรับคุณ เป็นตัวอย่างหนึ่งที่ใช้เวลาส่วนใหญ่ในการโทรexpและ / หรือlogซ้ำ ๆ กับอาร์กิวเมนต์เดียวกัน อีกตัวอย่างหนึ่งการเรียก DGEMM เพื่อเพิ่มจำนวนเมทริกซ์และพบว่าเวลาส่วนใหญ่เข้าสู่การเรียก LSAME เพื่อถอดรหัสข้อโต้แย้งอักขระอินพุต

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


4
ฉันไม่คิดว่ามันเป็นเพียงตำนานเมือง การสนับสนุนของ Fortran สำหรับการดำเนินการอาเรย์ทั้งหมดฟังก์ชั่น PURE / ELEMENTAL เป็นต้นสามารถช่วยคอมไพเลอร์ปรับให้เหมาะสม / เวกเตอร์หรือแม้แต่ขนาน สำหรับเช่นดูthinkingparallel.com/2007/08/14/... สิ่งที่คอมไพเลอร์ทำจริงคือเรื่องราวที่แตกต่างกัน
stali

@stali: มันขึ้นอยู่กับผู้ขายมากกว่า ขึ้นอยู่กับโปรแกรมที่กำลังรวบรวม ฉันเคยเห็นผู้คนพูดคุยทั่วไปจาก "มีโปรแกรมที่ Fortran สามารถทำให้ทำงานได้เร็ว" ถึง "Fortran นั้นเร็วกว่าสำหรับโปรแกรมใด ๆ " หากคุณชี้ให้เห็นว่าผู้คนสามารถเริ่มแฮ็กและลังเลและแยกขนและสิ่งที่มันเกิดขึ้นจริงในท้ายที่สุดก็ไม่มีอะไรมากไปกว่าสิ่งที่คนต้องการคิด
Mike Dunlavey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.