C ++ หรือ Python สำหรับการพัฒนาไลบรารี CFD


13

คุณจะพูดว่าอะไรคือข้อดี / ข้อเสียของสองวิธีในการเขียนโค้ดไลบรารีทั่วไป (finite volume, fem, dg) สำหรับกลศาสตร์ต่อเนื่องของการคำนวณ นี่คือสิ่งที่ฉันเห็นตอนนี้ดังนั้นโปรดให้ประสบการณ์ของคุณเองและอย่าทำให้ฉันเป็นประกาย :):

1) C ++:

  • การเขียนโปรแกรมทั่วไป, ฟังก์ชั่นเสมือนจริง, การบรรทุกเกินพิกัด, ความเร็ว ... : เครื่องมือ genreic + OOP ทั้งหมดที่มีอยู่เพื่อสร้างสิ่งที่คุณต้องการ

  • ห้องสมุดระดับต่ำส่วนใหญ่มีอยู่ (ไม่มีการพัฒนาด้านวิทยาศาสตร์และวิศวกรรมที่กว้างขวางเช่นห้องสมุดสำหรับ Python)

2) Python + wrappers สำหรับการคำนวณแบบขนาน (pyOpenCL และอื่น ๆ )

  • จำนวนมากรองรับ libs หลากหลายชนิด

  • โค้ดที่คุณคิด: การติดตั้งใช้งานเสร็จเร็วมาก

  • เวลาดำเนินการช้าลง

หากคุณต้องการเขียนโค้ดเฟรมเวิร์กที่รองรับวิธีการต่าง ๆ ทำงานกับรูปทรงเรขาคณิตและปัญหาที่ซับซ้อนคุณจะเลือกอะไรและทำไม


1
ฉันไม่คุ้นเคยกับ pyOpenCL แต่โดยทั่วไปแล้วการพูดของ Python จะช้าเกินไปสำหรับปัญหาในระดับปานกลางใน 2D หรือ 3D ยกเว้นว่า "kernels" ของคอมพิวเตอร์ของคุณถูกนำไปใช้ในภาษาระดับต่ำ (Fortran, C, ฯลฯ ) )
David Ketcheson

คำตอบ:


14

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

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

(นี่คือวิธีการแก้ปัญหา ODE / DAE ของ Mapleทำงานยกเว้นการใช้ Maple แทน Python การเปิดเผยแบบเต็ม: ฉันทำงานเพื่อพวกเขา)


1
+1 หนึ่งในบิตที่ดีของ Python คือความสามารถในการก้าวออกจาก "Pure Python" หากจำเป็น
Fomite

3

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


2

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

บางทีอาจจะเกี่ยวข้องกับการพิจารณาคือ

3) เวลาในการพัฒนา

  • เวลาที่สงวนไว้สำหรับการพัฒนา
  • ผลลัพธ์ของงานที่จะส่งมอบเมื่อใด แล้วยังไง?
  • มีรหัสอยู่แล้วซึ่งสามารถทำงานได้? (เอกลักษณ์?)

4) การบำรุงรักษา

  • ทรัพยากร (คน) มีจำนวนเท่าใดที่อุทิศให้กับการบำรุงรักษา
  • มีคนทำงานกับโค้ดกี่คน?
  • รหัสจะออกในบางจุด? (เกณฑ์?)
  • รหัสจะขึ้นอยู่กับห้องสมุดบุคคลที่สามหรือไม่

5) ปัญหาการออกใบอนุญาต

  • รหัสสำหรับการวิจัยคืออะไร?
  • รหัสสำหรับการใช้งานเชิงพาณิชย์คืออะไร?

6) ผลผลิตและปัจจัยความสนุกสนาน (มักจะมองข้าม!)

  • ที่ไหนจะได้ผลดีที่สุด
  • ที่ไหนที่จะมีการพัฒนาที่สนุกที่สุด?
  • มีโอกาสที่จะเป็นส่วนหนึ่งของเครือข่าย (โซเชียล) หรือไม่?

2

ขึ้นอยู่กับว่ารหัสของคุณสามารถเขียนเป็น:

some_library_specific_type grid;

for t=0 to T do
    library_function_1(grid,...);
    library_function_2(grid,...);
end

หรือค่อนข้างจะต้องเขียนเป็นดังนี้:

some_home_made_mixture_of_native_types grid;

for t=0 to T do
    for all grid elements as g do
        some_function(g,...);
        library_function(g,...);
    end
end

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


2

ในฐานะที่เป็นข้อพิสูจน์ถึงคำตอบของ Allan (เวลานักพัฒนาของคุณเองเป็นทรัพยากรที่มีค่าที่สุด): ใช้สิ่งที่คนอื่นทำไปแล้ว คุณบอกว่าคุณต้องการพัฒนาห้องสมุดสำหรับกลไกการคำนวณต่อเนื่อง แต่มีอยู่หลายแห่งที่มีขนาดใหญ่มากจนเกือบจะมีทุกสิ่งที่คุณต้องการอยู่แล้ว ลองดูดีลที่ II เช่นทุกสิ่งที่สามารถเขียนได้ว่าเป็นปัญหาองค์ประกอบ จำกัด OpenFOAM สำหรับพลศาสตร์ของไหลหรือ PyCLAW / CLAWPACK สำหรับปัญหาไฮเพอร์โบลิก ยกตัวอย่างเช่น deal.II ขอให้คุณเขียนโปรแกรมใน C ++ แต่ในความเป็นจริงระดับการเขียนโปรแกรมมักสูงมากจนอาจกล่าวได้ว่ามันเป็นเหมือนภาษาเฉพาะโดเมนสำหรับรหัส FEM โดยใช้ไวยากรณ์ C ++


2
ฉันได้เคยพบห้องสมุดที่มีทุกอย่างที่ผมจำเป็นต้องมี ...
แจ็ค Poulson

แต่คุณได้รับจุดฉันคิดว่า ห้องสมุดบางแห่งมี "เกือบทุกอย่าง" ที่คุณอาจต้องการ เพื่อยกตัวอย่างที่ฉันคุ้นเคยเป็นพิเศษนักแก้ปัญหาองค์ประกอบ จำกัด บนการปรับตัวเองอย่างเต็มที่ตาข่าย 3 มิติที่ทำงานบนโปรเซสเซอร์ 10,000+ ตัวโดยใช้ดีล. II และ PETSc 126 บรรทัดของโค้ด เห็นได้ชัดว่ามากกว่าศูนย์ แต่ในความเป็นจริงมีจำนวนน้อยมากเนื่องจากความซับซ้อนของสิ่งที่อยู่ภายใต้ประทุน
Wolfgang Bangerth

ในการเล่นผู้ให้การสนับสนุนของปีศาจมันไม่สำคัญเลยที่จะเรียกใช้รหัสบน 10,000 คอร์ แต่เป็นเรื่องที่แตกต่างอย่างสิ้นเชิงเพื่อให้สามารถปรับขนาดได้ ไม่จำเป็นต้องมีตัวประมวลผลแบบขนานจำนวนมากสำหรับสมการที่ไม่ใช่รูปไข่ซึ่งสามารถทำงานบนแกนประมวลผล 300 แกนได้อย่างมีประสิทธิภาพ
Jack Poulson

แน่ใจ แต่ตัวอย่างที่ผมกล่าวถึงคือสามารถปรับขนาด: math.tamu.edu/~bangerth/publications/2010-distributed.pdf
Wolfgang Bangerth

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