Modern C ++ ในการคำนวณทางวิทยาศาสตร์?


22

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

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

โปรดทราบว่าฉันไม่ได้ถามเกี่ยวกับห้องสมุดที่ใช้คุณสมบัติเหล่านี้ ฉันกำลังถามเกี่ยวกับบทความ / หนังสือ / ฯลฯ อธิบายว่าฉันสามารถใช้ประโยชน์จากคุณสมบัติเหล่านี้ในการคำนวณทางวิทยาศาสตร์ได้อย่างไร


2
คุณกำลังถามเกี่ยวกับ "ทันสมัย" ในแง่ของสิ่งที่เข้าใจกันว่าเป็นแนวปฏิบัติที่ดีที่สุดในปัจจุบัน (เทียบกับ 20 ปีก่อน) หรือ "ทันสมัย" ในแง่ของ C ++ 11/14 โดยเฉพาะ?
คิริลล์

2
@ Kirill ฉันคิดว่ามันทั้งคู่ ส่วนใหญ่เป็นสิ่งที่ใช้ C ++ 11/14 แต่ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด
becko

คำตอบ:


11

สองตัวอย่างของไลบรารีที่ใช้โครงสร้าง C ++ ที่ทันสมัย:

  • ทั้งห้องสมุด eigen และตัวนิ่ม (พีชคณิตเชิงเส้น) ใช้โครงสร้าง C ++ ที่ทันสมัยหลายอย่าง ตัวอย่างเช่นพวกเขาใช้ทั้งเทมเพลตนิพจน์เพื่อทำให้นิพจน์ทางคณิตศาสตร์ลดความซับซ้อนและบางครั้งสามารถกำจัดบางส่วนชั่วคราวได้:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (การนำเสนอบนเทมเพลตนิพจน์ในอาร์มาดิลโล่)

  • ไลบรารี CGAL (เรขาคณิตเชิงคำนวณ) ใช้คุณสมบัติ C ++ ที่ทันสมัยมากมาย (ใช้เทมเพลตและความเชี่ยวชาญเป็นพิเศษ):

http://www.cgal.org

บันทึก:

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

  • มีโค้ดกี่บรรทัดในโปรแกรม?
  • มีกี่คลาส / เทมเพลต
  • ใช้เวลา?
  • การใช้หน่วยความจำ?

ทุกอย่างที่เพิ่มขึ้นของคนสองคนแรกอาจจะถือว่าเป็นค่าใช้จ่าย (เพราะมันอาจจะทำให้โปรแกรมยากที่จะเข้าใจและเพื่อรักษา) ทุกอย่างที่ลดลงสองคนสุดท้ายคือกำไร

ยกตัวอย่างเช่นการแนะนำเป็นนามธรรม (ชั้นเสมือนหรือแม่แบบ) รหัสปัจจัยและสามารถทำให้โปรแกรมง่าย ( กำไร ) แต่ถ้ามันไม่เคย derivated / instanced เพียงครั้งเดียวแล้วก็แนะนำค่าใช้จ่ายที่ไม่เกี่ยวข้องกำไร (อีกครั้งมันเป็น บอบบางเพราะกำไรอาจมาในภายหลังในอนาคตวิวัฒนาการของโปรแกรมดังนั้นจึงไม่มี "กฎทอง")

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

ดูสิ่งนี้ด้วย

ในระดับทั่วไปและการเขียนโปรแกรมเมตาโดยใช้เทมเพลต C ++ มีประโยชน์ในด้านวิทยาศาสตร์คอมพิวเตอร์อย่างไร


2
กันไปสำหรับอาร์มาดิลโลเช่นเดียวกับ Eigen ไม่?
dr.blochwave

ใช่คุณพูดถูก (ฉันเพิ่งตรวจสอบในเอกสารของอาร์มาดิลโล่ฉันไม่ค่อยคุ้นเคย) ฉันกำลังแก้ไขโพสต์
BrunoLevy

1
เวลาในการรวบรวมที่นานขึ้นเป็นอีกหนึ่งค่าใช้จ่ายที่ควรกล่าวถึง
คิริลล์

@ คิริลใช่จุดดี (แก้ไขโพสต์เพื่อพูดถึงมัน) ขอบคุณ
BrunoLevy

10

ฉันขอแนะนำให้ดูดีลที่ II ใช้ STL เป็นตัววนซ้ำตัวชี้ที่ใช้ร่วมกันเป็นต้น

ตัวแก้เชิงเส้นแบบต่างๆสามารถใช้เมทริกซ์ต่าง ๆ ได้เนื่องจากวิธีการออกแบบ ฉันไม่ได้ใช้ความหมายของการเคลื่อนไหวใด ๆ แต่นั่นไม่ได้หมายความว่าพวกเขาไม่ได้อยู่ที่นั่น นี่คือลิงค์


นอกจากนี้ยังOpenFOAM - ใช้งานที่กว้างขวางสวยของแม่
tpg2114

1
deal.II ไม่ได้ใช้ซีแมนทิกส์การย้าย (เพราะไม่ใช้คุณลักษณะภาษา C ++ 11 - แต่ใช้คุณลักษณะไลบรารี C ++ 11 ซึ่งมีการแทนที่ใน BOOST สำหรับคอมไพเลอร์รุ่นเก่า) มันใช้คุณสมบัติภาษา C ++ อื่น ๆ ค่อนข้างมากรวมถึงภาษาทั้งหมดที่ถามในคำถามเดิม
Wolfgang Bangerth

ดูเหมือนว่าไม่ใช่เรื่องง่ายที่จะดูรายละเอียดของห้องสมุดขนาดใหญ่
Michael

7

HPXห้องสมุดทำให้การใช้งานหนักในช่วงของ C ++ ที่ 11 ให้บริการเช่นการก่อสร้างย้ายและยังมีเป้าหมายที่จะเป็นผู้ใช้งานที่สมบูรณ์ของN4409 (ร่างทำงานข้อมูลจำเพาะทางเทคนิคสำหรับ C ++ ส่วนขยายสำหรับ Parallelism)

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


ยินดีต้อนรับสู่ scicomp.se! หากคุณเพิ่มลิงก์หรืออ้างถึงบทความ / หนังสือ / บล็อกโพสต์ที่กล่าวถึงห้องสมุดนี้เพื่อการคำนวณทางวิทยาศาสตร์ฉันจะถอนคำตอบของคุณอย่างมีความสุข!
hardmath

5

ผมขอแนะนำการดูที่ทางวิทยาศาสตร์และวิศวกรรมภาษา C ++: บทนำด้วยเทคนิคขั้นสูงและตัวอย่างโดยบาร์ตันและ Nackmann

ความจริงที่ว่าหนังสือเล่มนี้ตีพิมพ์ในปี 1994 ทำให้ดูเหมือนว่าคุณละเมิดหลักเกณฑ์ "เทคนิคสมัยใหม่" อย่างไรก็ตาม Barton และ Nackmann อยู่ในขั้นสูงสุดของสิ่งที่เป็นไปได้ด้วยเทมเพลต C ++ ในเวลานั้นและเทคนิคที่เป็นนวัตกรรมที่พวกเขาคิดค้นเพื่อให้ได้ประสิทธิภาพที่ดียังคงถูกใช้ในไลบรารีคลาส C ++ ล่าสุด


4

นอกจาก deal.ii (ซึ่งแนะนำไว้แล้วที่นี่) คุณสามารถดูที่Duneไลบรารี่ซึ่งใช้คุณสมบัติ C ++ ขั้นสูงเช่นเทมเพลต metaprogramming, iterator range, สมาร์ทพอยน์เตอร์เป็นต้น นอกจากนี้ยังมีการพิมพ์ครั้งล่าสุดโดย Joachim Schöberlซึ่งแสดงความคิดเห็นเกี่ยวกับการใช้คุณสมบัติ C ++ 11 เช่นฟังก์ชั่นแลมบ์ดาเช่นสำหรับแลมบ์ดาเพื่อให้การใช้วิธีไฟไนต์อิลิเมนต์ใน NGSolve ง่ายขึ้น การส่งเสริมนอกจากนี้ยังมีห้องสมุดบางส่วนที่เกี่ยวข้องกับการเขียนโปรแกรมทางวิทยาศาสตร์เช่น uBLAS, กราฟและอื่น ๆ ฉันเดาว่าส่วนใหญ่ของห้องสมุดเหล่านี้คุณจะพบตัวอย่างที่ดีของการใช้งาน C ++ ที่ทันสมัย อย่างไรก็ตามโปรดทราบว่าคุณอาจพบตัวอย่างที่ไม่ดีของการใช้ C ++ ขั้นสูง / ทันสมัย ในบางกรณีในขณะที่อ่านรหัส / เอกสารฉันรู้สึกว่าบางครั้งสิ่งต่าง ๆ เป็นเรื่องธรรมดาสำหรับการแสดงทักษะขั้นสูงเช่น TMP ซึ่ง 99% ของแอปพลิเคชันที่มีศักยภาพทั้งหมดการดำเนินการที่ตรงไปตรงมามากขึ้น งาน.


3

หนังสือ "คู่มือการคำนวณทางวิทยาศาสตร์ใน C ++" โดยพิตต์-ฟรานซิสและไวท์ลีย์ถูกเขียนขึ้นเพื่อตอบว่าเรียงลำดับของสิ่งนี้ (การใช้ STL, iterators ฯลฯ ) มันสามารถใช้ได้ผ่านทางอเมซอนหรือเป็น e-Book จากสำนักพิมพ์

การเปิดเผยข้อมูล - ฉันทำงานในกลุ่มการวิจัยเดียวกับผู้แต่ง แต่ก็ยังคิดว่ามันเป็นทรัพยากรที่ดีสำหรับเรื่องนี้!


1

ฉันคิดว่าหนังสือเล่มนี้เหมาะสำหรับคุณเช่นเดียวกับฉัน: การค้นหา Modern C ++: หลักสูตรเร่งรัดสำหรับนักวิทยาศาสตร์วิศวกรและโปรแกรมเมอร์ (C ++ In-Depth) โดย Peter Gottschling โดยเฉพาะถ้าใช้ร่วมกับหลักการเขียนโปรแกรมและการฝึกใช้ C ++ 2nd Edition Bjarne Stroustrup นักประดิษฐ์ของ C ++ เอง ทั้งสองควรให้พื้นแข็งที่จะยืนบน


0

ห้องสมุด Blazeสำหรับพีชคณิตเชิงเส้นทำให้การใช้งานหนักของ C ++ 14 ในรูปแบบของการอนุมานและต่อท้ายประเภทผลตอบแทน คุณสมบัติ C ++ ที่ทันสมัยอื่น ๆ ที่ใช้คือconstexpralias template และเทมเพลต metaprogramming ทั้งหมดที่มีการแสดงออกของ SFINAE

คุณยังสามารถใช้รายการเริ่มต้นสำหรับเวกเตอร์และเมทริกซ์ของคุณเช่น

blaze::DynamicVector<int> x{ 4, -1, 3 };

ดูรายละเอียดเพิ่มเติมได้จากหน้าเริ่มต้นใช้งาน

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