C ++ vs Fortran สำหรับ HPC


56

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


12
การผสมผสานของภาษาระดับสูงและระดับต่ำนั้นดีกว่าการใช้โดยเฉพาะอย่างยิ่งในความคิดของฉัน เช่นฉันใช้ Python + C ++
Faheem Mitha

2
คำตอบสำหรับคำถามนี้จะเป็นอัตนัยเกือบหมดจดและดังนั้นฉันไม่แน่ใจว่าคำถามนี้เหมาะสม
Jeff

คำตอบ:


61

บ่อยครั้งที่ตัวเลือกขึ้นอยู่กับ (1) ปัญหาที่คุณพยายามแก้ไข (2) ทักษะที่คุณมีและ (3) คนที่คุณทำงานด้วย (เว้นแต่เป็นโครงการเดี่ยว) ฉันจะไป (3) กันสักครู่เพราะมันขึ้นอยู่กับสถานการณ์ของแต่ละคน

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

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

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


17
"จำไว้เสมอว่าเวลาของคุณมีค่ามากกว่าเวลา CPU!" ในฐานะคนที่ทำงานใน HPC ฉันไม่เห็นด้วยกับส่วนนั้น ทุกอย่างอื่นอยู่ตรงจุด
Levi Morrison

19
"จำไว้เสมอว่าเวลาของคุณนั้นมีค่ามากกว่าเวลาของ CPU!" ในฐานะที่เป็นคนที่ทำงานด้านการวิจัยทางวิทยาศาสตร์ฉันไม่สามารถเห็นด้วยกับส่วนนั้นมากขึ้น
decvalts

3
"จำไว้เสมอว่าเวลาของคุณมีค่ามากกว่าเวลา CPU!" - ฉันต้องการที่จะโยนใน 2 เซ็นต์ของฉัน - โดยใช้หลายร้อยโหนดแต่ละคนมี 10+ แกนในการเรียกใช้โปรแกรมเป็นเวลาหลายสัปดาห์อาจตีความได้ว่าเป็นทรัพยากรอันมีค่าที่น่ากลัวที่สุดหากสองสามสัปดาห์สามารถผลิต รหัสที่ทำงานในสองสามวัน กลุ่ม HPC เหล่านั้นเป็นทรัพยากรทั่วไปที่หายากและมีราคาแพง
Dani_l

"จำไว้เสมอว่าเวลาของคุณนั้นว่องไวกว่าเวลาของ CPU มาก!", รหัสสำหรับหนึ่งสัปดาห์ แต่ใช้งานได้หนึ่งเดือน
fronthem

6
"โปรดจำไว้เสมอว่าเวลาของคุณมีค่ามากกว่าเวลา CPU!" ฉันจะเขียนโค้ดเป็นเวลาหนึ่งเดือนและทำงานในหนึ่งสัปดาห์! - สามารถทำได้มากขึ้นเมื่อมีการเขียนโค้ดและคนอื่น ๆ จะพบรหัสที่คุณเขียนมีประโยชน์มากขึ้นเช่นกัน
ชาร์ลส์

37

ฉันคิดว่าทั้ง C ++ และ Fortran นั้นดีพอและทำงานได้ดี

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

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

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

ข้อจำกัดความรับผิดชอบ: ฉันชอบ Fortran มากและฉันชอบมากกว่า C ++ สำหรับการคำนวณเชิงตัวเลข ฉันใช้เวลาเขียนโปรแกรม C ++ มากกว่า 2 ปีทุกวันและตั้งโปรแกรมเกือบหนึ่งปีใน Fortran สมัยใหม่ทุกวัน (ในขอบเขตองค์ประกอบ จำกัด ) ฉันใช้ Python และ Cython เป็นจำนวนมากเช่นกัน


1
One up สำหรับคำตอบแรกที่สมดุล ฉันคิดว่า C ++ และ Fortran นั้นไม่ใช่ความเป็นไปได้เพียงอย่างเดียวใน HPC ร่วมสมัย ฉันคิดว่ามันเป็นการดีที่จะรู้จุดแข็งและจุดอ่อนเมื่อคุณตัดสินใจเลือก Fortran, C ++ หรือ Python (หรืออะไรก็ตามที่คุณชอบ) ฉันเห็นฟอร์แทรน 20.000 บรรทัดในไฟล์เดียวซึ่งเติบโตแบบอินทรีย์มาหลายทศวรรษแล้ว ฉันเองจะไม่ใช้สิ่งอื่นใดนอกจากการประมวลผลแบบอาเรย์หนักหน่วง ไม่แม้แต่สำหรับสิ่งที่เกี่ยวข้องกับการส่งออก จนถึงตอนนี้สำหรับความคิดเห็นที่เอนเอียง
shuhalo

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

6
Bill คุณใช้ Fortran สมัยใหม่ (90 และเพิ่มเติมในภายหลัง) สิ่งนี้สำคัญมาก (ฉันควรจะตอบคำถามนี้ให้ชัดเจนกว่านี้) แน่นอน "20.000 บรรทัดของ Fortran" หรือ f77 มักจะไม่ดีกว่าภาษา C ++ ที่เขียนได้ดี
OndřejČertík

1
@ OndřejČertík: ฉันคิดว่าถ้าคุณเชื่อว่าโปรแกรมไฟไนต์อิลิเมนต์สมัยใหม่ใช้โครงสร้างข้อมูล "แบบง่าย" คุณก็จะไม่ได้ดูข้อมูลใด ๆ ลองใช้อิลิเมนต์ไฟไนต์แบบปรับได้, วิธีการของ HP, หรือหลายค่าในตาข่ายที่ไม่มีโครงสร้าง บิลเป็นจุดและฉันเชื่อว่าฉันสามารถพูดกับเขาในการบอกว่าการใช้ "ทันสมัย ​​Fortran" จะทำให้แทบจะไม่แตกต่างกันเล็กน้อย
Wolfgang Bangerth

6
@ WolfgangBangerth ดูตัวอย่าง Phaml ( math.nist.gov/phaml ) สำหรับการนำ Fortran ไปใช้กับทุกสิ่งที่คุณพูดถึง
OndČejČertík

31

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

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

ก่อนอื่นการอภิปรายของ Fortran / C ที่มีคอมไพเลอร์ที่ดีกว่านั้นคือการพิจารณา คอมไพเลอร์ C / Fortran เฉพาะเป็นเรื่องของอดีต ทั้ง gcc / gfortran และ icc / ifc เป็นเพียงส่วนหน้าที่แตกต่างกันไปเป็น back-end เดียวกันนั่นคือโปรแกรมของคุณจะถูกแปลงเป็นคำอธิบายที่เป็นนามธรรมโดย front-end จากนั้นปรับให้เหมาะสมและประกอบโดยส่วนท้าย ถ้าคุณเขียนความหมายรหัสเดียวกันใน Fortran หรือใน C คอมไพเลอร์จะสร้างแอสเซมบลีเดียวกันซึ่งจะทำงานได้เร็วในทั้งสองกรณี

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

ดังนั้นความแตกต่างที่สำคัญคือโปรแกรมเมอร์ไม่ใช่ภาษา ดังนั้นจึงไม่มีความแตกต่าง? ก็ไม่มาก นี่คือตัวอย่างบางส่วน:

  • SIMD: ไม่ว่าจะเป็น SSE, SSE3 หรือ AltiVec ถ้าคุณต้องการที่จะใช้พวกเขาใน Fortran คุณหวังที่ดีขึ้นและอธิษฐานว่าคอมไพเลอร์คาดเดาว่าสิ่งที่คุณต้องการและไม่ได้ดังนั้น โชคดี. ใน C คุณมักจะมีฟังก์ชั่นที่แท้จริงสำหรับแต่ละสถาปัตยกรรมหรือเมื่อเร็ว ๆ นี้โดยทั่วไปSIMD ประเภทเวกเตอร์ใน GCC คอมไพเลอร์ของ Fortran ส่วนใหญ่จะใช้คำสั่ง SIMD เท่านั้นในการคลี่ลูป แต่ถ้าคุณมีเคอร์เนลที่ทำงานกับเวกเตอร์ข้อมูลสั้น ๆ ในลักษณะที่ไม่ชัดเจนผู้รวบรวมอาจจะมองไม่เห็น

  • สถาปัตยกรรมฮาร์ดแวร์ที่แตกต่าง: สถาปัตยกรรม CUDA ทั้งหมดถูกสร้างขึ้นรอบ ๆ เมล็ดในซีใช่แล้วตอนนี้พอร์ตแลนด์กรุ๊ปมีคอมไพเลอร์ Fortran ที่มีความสามารถในการใช้ CUDAด้วย แต่มันเป็นเชิงพาณิชย์และที่สำคัญที่สุดไม่ใช่จาก NVIDIA เช่นเดียวกันกับ OpenCL ซึ่งสิ่งที่ดีที่สุดที่ฉันสามารถหาได้คือโครงการล่าสุดซึ่งรองรับการโทรพื้นฐานเพียงไม่กี่ครั้งเท่านั้น

  • การเขียนโปรแกรมแบบขนาน: ใช่ทั้ง MPI และ OpenMP ทำงานได้ดีกับ C และ Fortran อย่างไรก็ตามหากคุณต้องการควบคุมเธรดของคุณอย่างแท้จริงเช่นถ้าคุณมีการคำนวณหน่วยความจำที่แชร์แบบไดนามิกเต็มรูปแบบคุณจะอยู่ในความหนาวเย็นด้วย Fortran ใน C คุณมี pthreads มาตรฐานซึ่งในขณะที่ไม่อบอุ่นและคลุมเครือจะยังคงนำคุณผ่านพายุ โดยทั่วไปการคำนวณส่วนใหญ่ที่อาศัยการเข้าถึงระบบปฏิบัติการเช่นเธรดกระบวนการระบบไฟล์ ฯลฯ ... จะได้รับการบริการที่ดีขึ้นด้วย C. Oh และไม่พยายามทำเครือข่ายของคุณเองกับ Fortran

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

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

ทั้งหมดนี้เป็นสิ่งที่ค่อนข้างเกินบรรยาย แต่เป็นคอมพิวเตอร์ประสิทธิภาพสูงที่เรากำลังพูดถึงใช่มั้ย หากคุณไม่สนใจวิธีการใช้ประโยชน์จากกระบวนทัศน์ฮาร์ดแวร์พื้นฐานเช่นการนำไปใช้และ / หรือการพัฒนาอัลกอริธึมที่ดีที่สุดสำหรับหน่วยความจำที่แชร์ / กระจาย, เธรด, เวกเตอร์ SIMD, GPUs ที่ใช้ SIMT และอื่น ๆ แค่ทำคณิตศาสตร์บนคอมพิวเตอร์

สิ่งนี้ได้นานขึ้นกว่าที่ฉันจะได้รับดังนั้นนี่เป็นบทสรุป - ชุดข้อความนำกลับบ้านที่แปลก ๆ :

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

5
การตอบสนองที่ดี ฉันไม่คิดว่าอย่างไรก็ตามความคิดเห็นสุดท้ายของคุณจำเป็นต้องเป็นจริง ฉันเป็นโปรแกรมเมอร์ C ด้วยตัวเอง แต่คุณสามารถเข้าถึงสิ่งต่าง ๆ ในระดับต่ำใน Fortran ผ่านการฝึกฝนการเขียนโปรแกรมที่ดี วิธีที่เหมาะในการใช้สิ่งต่าง ๆ เช่น SIMD ops คือการเขียนโค้ดซึ่งแนะนำอย่างยิ่ง (เช่นการบล็อกลูปออก) และให้คอมไพเลอร์ทำเพื่อคุณ สำหรับเธรดเพียงใช้ openMP (pthreads ยังสามารถใช้ได้กับงานพิเศษบางอย่าง) Fortran มีทุกสิ่งที่คุณพูดถึงมันไม่เพียงแค่อยู่ในระดับที่สำคัญสำหรับผู้ใช้ทั่วไป: ตัวเลข
Reid.Atcheson

@ Reid.Atcheson: ถ้าคุณปิดกั้นทุกอย่างที่คอมไพเลอร์จะจับมันก็จะทำงานโดยอัตโนมัติทั้งใน C และใน Fortran อย่างไรก็ตามปัญหาคือคุณต้องการเชื่อถือคอมไพเลอร์ของคุณไกลแค่ไหน? และทำไมคุณต้องเชื่อใจในกรณีที่คุณรู้ว่าคุณต้องการทำอะไร? OpenMP ทำเธรดใช่ แต่บล็อกฉลาด คุณสามารถหลอกให้ได้รับกลุ่มเธรดที่แตกต่างกันเพื่อทำสิ่งต่าง ๆ แต่นั่นเป็นเพียงการใช้ OpenMP ผิด Pthreads สำหรับ Fortran เป็นเพียงฟังก์ชั่น C เท่านั้น ฉันเห็นด้วยว่า Fortran นั้นง่ายกว่าถ้าคุณไม่ได้ลงรายละเอียด
Pedro

1
แน่นอนว่าคุณจะไม่ได้รับประสิทธิภาพสูงสุดเต็มเป่า 99% อาศัยคอมไพเลอร์ แต่คุณสามารถเข้ามาใกล้ได้อย่างง่ายดาย นอกเหนือจากนี้คุณต้องใช้อินทิลิตี้หรืออินไลน์ ASM คุณต้องทำสัมปทานเพื่อประสิทธิภาพของโปรแกรมเมอร์โดยรวมนั่นเป็นเหตุผลว่าทำไมภาษาโปรแกรมจึงมีอยู่ในตอนแรก ในขั้นตอนที่คุณวิกลจริตมากพอที่จะรับรายละเอียดเกี่ยวกับอินทรินหรือ ASM (ฉันมีมาสองสามครั้ง) Fortran ไม่ใช่ไม้ค้ำยัน คุณจะรู้วิธีเชื่อมโยงในโค้ดที่ได้รับการปรับปรุงด้วยมือของคุณแล้วยังไงก็ตาม
Reid.Atcheson

@ Reid.Atcheson: ผมขอยืนยันว่าสำหรับแอพพลิเคชั่น HPC แบบขนานคุณอาจลงเอยด้วยประสิทธิภาพสูงสุดต่ำกว่า 99% ... และประเภทเวกเตอร์ gcc ทำให้การใช้งานแบบอินทิลิตี้ไม่ใช่ประเด็น :)
Pedro

1
@Pedro โพสต์ที่ยอดเยี่ยม ยอดเยี่ยมอย่างแน่นอน ขอบคุณมากสำหรับการโพสต์ เพิ่งค้นพบมันในขณะที่สุ่มค้นหาผ่านกระทู้ที่น่าสนใจ
สอบถาม

16

จาก 15 ปีของการคิดเกี่ยวกับซอฟต์แวร์ทางวิทยาศาสตร์: หากโค้ดของคุณทำงานเร็วขึ้น 25% เพราะคุณเขียนใน Fortran แต่ใช้เวลาในการเขียนนานถึง 4 เท่า (ไม่มี STL ความยากในการใช้โครงสร้างข้อมูลที่ซับซ้อน ฯลฯ ) Fortran จะชนะก็ต่อเมื่อคุณใช้นิ้วโป้งนิดหน่อยในแต่ละวันและรอให้การคำนวณของคุณเสร็จสิ้น ระบุว่าสำหรับเราเกือบทุกคนสิ่งที่มีค่าที่สุดคือเวลาของเราเองข้อสรุปคือ: ใช้ภาษาที่ช่วยให้คุณพัฒนาแก้จุดบกพร่องและทดสอบรหัสของคุณได้เร็วที่สุดโดยไม่สนใจว่าอาจช้ากว่าถ้าเป็นไปได้ คุณเขียนมันใน Fortran


13

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

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

จากทั้งหมดที่กล่าวมาฉันคิดว่าการยกเลิกแพ็คเกจทางวิทยาศาสตร์ที่เขียนในภาษาระดับต่ำ (และ Fortran) คือการลังเลที่จะเปิดเผยส่วนต่อประสานที่สะดวกสำหรับโครงสร้างข้อมูลที่มีความซับซ้อน: คนส่วนใหญ่พึงพอใจกับอินเทอร์เฟซ BLAS ของ Fortran พอยน์เตอร์และมิติชั้นนำเพื่ออธิบายการฝึกอบรม แต่มีเพียงไม่กี่คนที่ยืนยันว่าอินเทอร์เฟซตัวแก้ปัญหาแบบกระจัดกระจายโดยตรงจำนวน 40 Fortran เป็นสิ่งที่ใกล้เคียงกับความสะดวกสบาย (เทียบกับ UHM, SuperLU, PETSc และ Trilinos)

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

y:=αx+y


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

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

ฉันมีประสบการณ์เดียวกันกับคำหลัก "จำกัด " (รหัส Fortran ง่าย ๆ ของฉันเร็วขึ้นเล็กน้อยเสมอ) แต่ความเชี่ยวชาญของฉันมี จำกัด และฉันไม่มีเวลาลงทุนทำความเข้าใจกับแอสเซมบลีที่สร้างขึ้นจาก gcc ดังนั้นฉันจึงใช้ Fortran มันง่ายและรวดเร็ว
OndřejČertík

@JackPoulson: อาร์กิวเมนต์คอมไพเลอร์เป็นสิ่งที่ฉันได้ยินจากชุมชน Fortran สักหน่อย น่าเสียดายที่คอมไพเลอร์ส่วนใหญ่เช่น gcc หรือ ifc / icc ใช้ส่วนหน้าของภาษาอื่นสำหรับแบ็คเอนด์เดียวกัน เครื่องจักรทำเพิ่มประสิทธิภาพและรหัสรุ่นเป็นเหมือนกันและดังนั้นจึงแตกต่างของผลที่มีมากที่สุดอาจจะเป็นเพราะความแตกต่างในความคุ้นเคยของโปรแกรมเมอร์กับภาษาพื้นฐาน ...
เปโดร

1
เพียงแค่ให้มุมมองเล็กน้อยเกี่ยวกับการอ้างสิทธิ์ที่ไม่ค่อยได้รับการยืนยันบ่อยครั้งว่า Fortran เร็วกว่าในเมล็ดตัวเลข: ในขณะที่เรากลับสังเกตเห็นว่าเมทริกซ์กระจัดกระจาย - เวกเตอร์คูณในแพ็คเกจ Epetra ของ Trilinos ช้ากว่า 30% deal.II. อดีตถูกเขียนในแบบตรงไปตรงมา Fortran 77, หลังในตรงไปข้างหน้า C โดยไม่ต้องใช้ 'จำกัด ' ทั้งคู่มีโค้ดประมาณ 10-15 บรรทัด วันนี้ Trilinos ใช้โค้ดที่ยกมาจากดีล ฉันแน่ใจว่าสามารถพบหลายกรณีที่ F77 เร็วกว่า C. ประเด็นก็คือวันนี้ไม่ได้เป็นสากลอีกต่อไป
Wolfgang Bangerth

8

ตั้งแต่ฉันใหม่ที่นี่ฉันได้ดูคำถามเก่า ๆ และพบคำถามนี้ หวังว่ามันคงเป็นเรื่องต้องห้ามที่จะตอบคำถามเก่า ๆ !

เนื่องจากไม่มีใครพูดถึงเรื่องนี้ฉันคิดว่าฉันจะ Fortran 2003 ได้รับการสนับสนุนอย่างเต็มที่จากคอมไพเลอร์หลักส่วนใหญ่ (intel, ibm, cray, NAG, PCG) แม้ gcc ด้วยรีลีสใหม่ล่าสุด (เร็ว ๆ นี้) 4.7 Fortran 2003 (และ 2008) เป็นภาษาเชิงวัตถุแม้ว่าจะมีความละเอียดมากกว่า C ++ เล็กน้อย สิ่งหนึ่งที่ฉันคิดว่าดีเกี่ยวกับ Fortran ก็คือความจริงที่ว่าคณะกรรมการมาตรฐานเห็นการคำนวณทางวิทยาศาสตร์ในฐานะผู้ชมหลัก (ฉันขอบคุณ Damian Rouson ที่ชี้ให้ฉันเห็นสิ่งนี้ในวันอื่น ๆ )

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

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


7

ปัญหาของ C ++ คือคุณมีโอกาสมากมายที่จะทำลายประสิทธิภาพการทำงานตัวอย่างเช่นโดยการใช้ STL ข้อยกเว้นคลาส (ปัญหาค่าโสหุ้ยเสมือนจริงและการจัดตำแหน่ง), ตัวดำเนินการโอเวอร์โหลด (เทมเพลตใหม่ / การลบซ้ำซ้อน) หรือเทมเพลต ดูเหมือนอ่อนโยน แต่คุณสามารถเสียเวลาด้วยวิธีนี้)

อย่างไรก็ตามยิ่งคุณเข้าถึงไลบรารีทั่วไปได้มากขึ้นและอาจทำให้มองเห็นโค้ดของคุณได้ดีขึ้น (แม้ว่านี่จะขึ้นอยู่กับฟิลด์และคุณยังคงมี C บริสุทธิ์อยู่) และคุณยังสามารถชดเชยการขาดความยืดหยุ่นของ Fortran โดยการห่อโค้ดในภาษาสคริปต์เช่น R, Lush, Matlab / Scilab หรือแม้แต่ Python, Ruby หรือ Lua


1
เป็นความคิดที่ดีที่จะใช้เทคนิคระดับต่ำในภาษาระดับสูง ตัวอย่างเช่น STL ได้รับการออกแบบให้ทำงานในระดับนามธรรม หนึ่งจะต้องตระหนักถึงสิ่งที่อินเตอร์เฟซที่ได้รับการออกแบบใช้สำหรับงานนี้แล้วออกไปจากวิธีการรวบรวม
shuhalo

2
ฉันคิดว่าคะแนนของ mbq ​​และ Martin นั้นไม่ยุติธรรม ใช่มีวิธียิงตัวเองที่เท้าหากคุณพยายามที่จะใช้เวกเตอร์ตัวเลขสำหรับวัตถุประสงค์พีชคณิตเชิงเส้นโดยใช้ std :: list <double> แต่นั่นเป็นอาร์กิวเมนต์ที่โง่เง่า: อย่างน้อย C ++ มีคลาส list ที่เชื่อมโยงซึ่งคุณสามารถใช้ได้ในขณะที่ Fortran ไม่มี มันเหมือนกับการพูดว่า "รถยนต์ขับด้วยความเร็วสูงจนคุณชนเข้ากับกำแพงและได้รับบาดเจ็บคุณควรใช้รถม้าแทน" เป็นเพียงความคิดที่โง่ที่จะทิ้งภาษาระดับสูงที่รองรับเนื้อหาระดับต่ำ (เช่น C ++) สำหรับการมีคุณสมบัติระดับสูง
Wolfgang Bangerth

@ WolfgangBangerth ไม่ตอนนี้คุณกำลังเจ็บฟอร์แทรน - มันเป็น "ระดับต่ำ" เนื่องจากแบคทีเรียมีการพัฒนาน้อยกว่ามนุษย์ ถ้าคุณต้องการให้รถเปรียบเทียบมันควรจะเป็น "คุณสามารถใช้ทั้งรถจี๊ปและเล็กซัสข้ามทางแอ่งน้ำ แต่ใช้คนแรกเจ็บน้อย"
mbq

1
ฉันขอขอบคุณความคิดเห็นของคุณ แต่ฉันยืนยันว่า Fortran ไม่ได้พัฒนาตามที่ C ++ คือ :-)
Wolfgang Bangerth

7

ข้อเท็จจริงสามประการ:

  • อาร์เรย์ N-style ในแบบ F77 ใน C: ไม่มีปัญหาในการใช้CnD (ปลั๊กไร้ยางอาย, เป็นที่ยอมรับ)

  • ระบบโมดูลของ F90 ออกแบบมาไม่ดีและไม่เอื้ออำนวยต่อการสร้างสภาพแวดล้อม (ชื่อโมดูลไม่ตรงกับชื่อไฟล์เช่น)

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

หนึ่งความประทับใจส่วนตัว:

  • Fortran ทำงานได้ไม่ดีในการจัดการข้อมูล ลองส่งคืนพอยน์เตอร์ให้กับโครงสร้างข้อมูลแบบทึบโดยผู้ใช้ใน F77 หรือ F90 ( transfer()เรามาที่นี่)

สวัสดี Andreas! CnD น่าสนใจฉันไม่รู้เกี่ยวกับมัน อาคุณเขียนมัน :) (f90 ยังรองรับการแบ่งส่วน, จัดสรรได้สำหรับอาร์เรย์และที่สำคัญที่สุด - ไวยากรณ์อาร์เรย์สำหรับการคูณ, การเพิ่มเป็นต้น) ฉันใช้ CMake กับ Fortran และทำงานได้ดีกับโมดูล "รายการอาร์กิวเมนต์" คืออะไร? ฉันไม่คิดว่าฉันใช้สิ่งเหล่านี้ดังนั้นจำเป็นต้องมีสถานที่เพียง 3 แห่งในการแก้ไข ใน C โดยทั่วไปคุณจะต้องแก้ไขโค้ดจริงพารามิเตอร์และไฟล์ส่วนหัวดังนั้นจึงเป็น 3 ตำแหน่ง (แน่นอนที่สุดใน C ++) ใช่การถ่ายโอน () ไม่ดีมาก แต่โดยทั่วไปแล้วคุณไม่จำเป็นต้องใช้มันในทางปฏิบัติ
OndřejČertík

3
การรีฟอร์รันฟอร์แทรนสมัยใหม่นั้นไม่สำคัญกับ IDEs ที่เหมาะสมเช่น Photran ใน eclipse

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

1
เพียงต้องการเพิ่มสิ่งที่ @ user389 กล่าวว่าในขณะที่ Photran นั้นยอดเยี่ยมและเป็น Fortran IDE เพียงตัวเดียวที่อนุญาตให้ทำการรีแฟคเตอร์ parser ของมันล้มเหลวตลอดเวลา ในทางตรงกันข้ามไม่จำเป็นต้องแสดงความคิดเห็นเกี่ยวกับความจริงที่ว่า Eclipse เป็นหน่วยความจำหิว
astrojuanlu

5

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

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


ถูกตัอง. สำหรับการแยกวิเคราะห์ข้อความฉันยังใช้ Python
OndřejČertík

คุณสามารถใช้ส่วนหนึ่งของสคริปต์ Python ในภาษาที่คอมไพล์เช่น C ++ และเชื่อมโยงกับมันเช่น Boost Python, Swig เป็นต้น
Faheem Mitha

4

ฉันกำลังทำงานในห้องแล็บแห่งชาติแห่งหนึ่ง คนส่วนใหญ่ที่อยู่รอบตัวฉันเป็นวิศวกรเครื่องกล การแชทกับคนในกลุ่ม HPC พวกเขาส่วนใหญ่ใช้ Linux และ C ++ เป็นส่วนใหญ่ กลุ่มที่ฉันใช้อยู่ในปัจจุบันส่วนใหญ่จะเป็นแอปพลิเคชันเดสก์ท็อปและเราใช้ Windows และเรียงลำดับจากมากไปน้อย: C #, FORTRAN, Python, VBA และ VB (6 ไม่ใช่. NET) บางส่วนของการจำลองเครื่องมือที่เราใช้ถูกเขียนขึ้นในห้องปฏิบัติการระดับชาติอื่น ๆ ใน FORTRAN


4

ขออภัยที่ขุดเธรดเก่า แต่ดูเหมือนว่าในปี 2015 ฟอร์แทรนยังถูกใช้งานอย่างมาก

ฉันเพิ่งเจอรายการนี้ ( ลิงค์สำรอง) ซึ่งโดยทั่วไปแล้วเป็นรายการของรหัส 13 รหัสที่ได้รับการอนุมัติจากโรงงาน OCLF ของ DOE เพื่อทำงานบนเครื่อง 300-petaFLOPS Summit ซึ่งจะให้บริการแก่นักวิจัยในปี 2018 ฉันพยายามค้นหาภาษาหลักที่ใช้ สำหรับรหัส (ตามการค้นหา google ด่วน) และนี่คือสิ่งที่ฉันพบ:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

ดังนั้นจาก 13 รหัสอย่างน้อย 10 (ขึ้นอยู่กับการค้นหาอย่างรวดเร็วของฉัน) ดูเหมือนจะเขียนใน Fortran ไม่เลวสำหรับภาษาเก่า 50 ปี

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


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

บางทฤษฎีความหนาแน่นของรหัสฟังก์ชันการทำงานที่เขียนใน Fortran รวมถึงVASPและCASTEPแม้ว่า @GeoffOxberry จะชี้ให้เห็น แต่โครงการใหม่อาจมีแนวโน้มที่จะกลายเป็น C ++
dr.blochwave

@ blochwave ตามที่คุณสามารถอ่านได้ในลิงค์โครงการนี้มีไว้สำหรับเครื่องใหม่ (พร้อมตัวเร่งความเร็ว ฯลฯ ) ที่จะออนไลน์ในปี 2018 ดังนั้นจึงไม่เหมือนกับที่พวกเขาใช้รหัส 25 ปีและคอมไพล์หวังว่าจะทำงานได้ดี ประสิทธิภาพ. ฉันค่อนข้างมั่นใจว่าส่วนใหญ่ของรหัสในรายการด้านบนมีหรือถูกเขียนใหม่เช่นเดียวกับในรหัสใหม่ รหัสสภาพภูมิอากาศ "ใหม่" มีอยู่ใน Fortran เช่นกันและมีการใช้งานโดยหน่วยงานหลายแห่งในหลายประเทศ
stali

0

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

คำถามที่ดีกว่าคือตัวอย่างของซอฟต์แวร์ที่ออกแบบมาอย่างดีเยี่ยมที่ควรค่าแก่การศึกษาเพื่อเรียนรู้เกี่ยวกับวิธีการออกแบบซอฟต์แวร์ที่มีเลเยอร์

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