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


17

ภาษา C ++ ให้การเขียนโปรแกรมทั่วไปและmetaprogrammingผ่านแม่ เทคนิคเหล่านี้พบวิธีในแพ็คเกจการคำนวณทางวิทยาศาสตร์ขนาดใหญ่จำนวนมาก (เช่นMPQC , LAMMPS , CGAL , Trilinos ) แต่สิ่งที่พวกเขามีส่วนร่วมในการคำนวณทางวิทยาศาสตร์ในมูลค่าที่นอกเหนือไปจากภาษาที่ไม่ใช่ทั่วไปและไม่ใช่เมตาเช่น C หรือ Fortran ในแง่ของเวลาในการพัฒนาโดยรวมและการใช้งานสำหรับประสิทธิภาพเท่าเทียมกันหรือเพียงพอ?

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


ฉันกังวลว่าคำถามนี้อาจเปิดรับความคิดเห็นได้ แต่ฉันต้องการเห็นสิ่งที่ผู้คนในชุมชนพูด
Geoff Oxberry

1
ฉันลบความคิดเห็นที่ตกรางอย่างสมบูรณ์ หากคุณต้องการให้โพสต์ใหม่เพื่อแชทหรือเมตาฉันยินดีที่จะทำเช่นนั้น ดูเมตาของฉันที่นี่
Aron Ahmadia

3
นอกจากนี้ให้ดูที่คำถามที่เกี่ยวข้องที่นี่ตามคำแนะนำสำหรับเมื่อจะใช้และเมื่อแม่ที่จะหลีกเลี่ยงการแสดงออก
Aron Ahmadia

ฉันไม่คิดว่ามันถูกต้องที่จะบอกว่า LAMMPS ใช้เทมเพลตหรือ metaprogramming LAMMPS เป็นโค้ดเชิงวัตถุที่มีลักษณะเหมือน Fortran เป็นส่วนใหญ่ ฉันไม่คิดว่า MPQC มีเทมเพลตมากนัก แต่มันก็เป็นวัตถุที่มุ่งเน้นและ polymorphic อย่างหนัก
เจฟฟ์

1
OpenFOAMใช้ประโยชน์จากเทมเพลตและคุณสมบัติอื่น ๆ ของ C ++ อย่างหนัก
Dohn Joe

คำตอบ:


14

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

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

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


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

5
แน่นอนว่ามันเป็นเทคนิคที่มีคุณค่า แต่มันยากที่จะรักษาและก็มักจะใช้งานยากถ้ามันถูกเปิดเผยกับอินเทอร์เฟซภายนอก ที่กล่าวว่าฉันคิดว่าหนึ่งในเหตุผลที่ TMP ไม่ได้ค่อนข้างประสบความสำเร็จคนอาจคาดหวังในขั้นต้นคือการรวบรวมได้กลายเป็นดีมาก TMP มีชีวิตอยู่จากข้อเท็จจริงที่ว่ามีหลายสิ่งที่เป็นที่รู้จักกันในเวลารวบรวมและจากนั้นสามารถแพร่กระจายเป็นค่าคงที่ในรหัสจริง แต่คอมไพเลอร์ได้กลายเป็นค่อนข้างดีที่ inlining, cloning ฟังก์ชั่น ฯลฯ และดังนั้นส่วนสำคัญของผลประโยชน์สามารถรับได้ในวันนี้โดยใช้การเขียนโปรแกรม "ปกติ"
Wolfgang Bangerth

15

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

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

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

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

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


3

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

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

จากประสบการณ์ของฉันฉันได้รับSUBROUTINEสายที่มีข้อโต้แย้ง 55 รายการ (เข้า & ออก) และฉันลดจำนวนนั้นเป็น 5 ทำให้รหัสดีขึ้น

นั่นคือคุณค่า


3

ฉันเป็นผู้สนับสนุนที่แข็งแกร่งของการเขียนโปรแกรมทั่วไปและการเขียนโปรแกรมเมตาสำหรับการคำนวณทางวิทยาศาสตร์ จริง ๆ แล้วฉันกำลังพัฒนาซอฟต์แวร์ไลบรารี C ++ ฟรีสำหรับวิธี Galerkin ตามเทคนิคเหล่านี้เรียกว่า Feel ++ (http://www.feelpp.org) ซึ่งได้รับแรงผลักดันอย่างต่อเนื่อง จริงอยู่ที่ยังคงมีปัญหาเช่นเวลารวบรวมช้าและช่วงการเรียนรู้อาจสูงชันหากต้องการเข้าใจว่าเกิดอะไรขึ้นเบื้องหลัง อย่างไรก็ตามนี่เป็นสิ่งที่น่าสนใจและน่าเหลือเชื่อ หากทำในระดับห้องสมุดและซ่อนความซับซ้อนไว้เบื้องหลังภาษาเฉพาะโดเมนคุณจะได้รับเครื่องมือที่ทรงพลังอย่างยิ่ง เรามีวิธีการที่หลากหลายในการใช้งานและการเปรียบเทียบ เพื่อวัตถุประสงค์ในการสอนการคำนวณทางวิทยาศาสตร์สิ่งนี้ยอดเยี่ยมมากสำหรับการวิจัยและวิธีตัวเลขใหม่ ๆ สำหรับการใช้งานขนาดใหญ่ เราทำงานกันดี แต่จนถึงตอนนี้เราสามารถทำสิ่งดีๆได้แล้ว เรามีวิศวกรนักฟิสิกส์และนักคณิตศาสตร์ที่ใช้มันส่วนใหญ่ใช้ภาษาเพื่อกำหนดสูตรและพวกเขามีความสุขกับมัน เมื่อมองไปที่สูตรบางอย่างที่เพื่อนร่วมงานของนักฟิสิกส์ของเราจัดการฉันไม่อยากเห็นพวกเขาทำ "ด้วยมือ" โดยไม่มีภาษาระดับสูงเพื่ออธิบายการกำหนดสูตร ฉันเองคิดว่า "เทคนิค" หรือ "กระบวนทัศน์" เหล่านี้จำเป็นต้องใช้ในการจัดการกับความซับซ้อนในโค้ดการคำนวณทางวิทยาศาสตร์โดยไม่ต้องคูณขนาดรหัสด้วยปัจจัยขนาดใหญ่ มีความจำเป็นที่จะต้องปรับปรุงการรองรับการเขียนโปรแกรมเมตาใน C ++ แต่มันก็มีรูปร่างที่ดีโดยเฉพาะอย่างยิ่งตั้งแต่ C ++ 11


2

คุณอาจพบบทความhttp://arxiv.org/abs/1104.1729 ที่เกี่ยวข้องกับคำถามของคุณ มันกล่าวถึงเทมเพลตนิพจน์ (แอปพลิเคชันเฉพาะของการเขียนโปรแกรมเมตาเทมเพลตที่ใช้ในรหัสทางวิทยาศาสตร์) จากมุมมองของประสิทธิภาพ


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

@aterrel: นี่เป็นสิ่งที่ตรงกันข้ามกับที่ฉันสงสัย การรู้ว่าคุณจะต้องทำการเพิ่มประสิทธิภาพของมือเป็นขั้นตอนสุดท้ายของการพัฒนาภาษาใดที่คุณจะเลือกเป็นฐานในการใช้ก่อนที่จะถึงขั้นตอนสุดท้าย เรามีข้อมูลที่หนักพอที่จะแนะนำภาษาใดให้เลือกบ้าง
Deathbreath

9
@Deathbreath: ฉันจะทำซ้ำคำตอบที่ฉันได้ทำในหัวข้ออื่น ๆ เช่นกัน - ที่มากและใหญ่การปรับความเร็วบิตสุดท้ายของรหัสของคุณเป็นสิ่งที่คุณไม่ค่อยทำ แต่คุณโปรแกรมอัลกอริทึมระดับสูงตลอดเวลา ดังนั้นเลือกภาษาที่ให้คุณทำสิ่งที่ยิ่งใหญ่ได้อย่างรวดเร็ว มีวิธีการรวมเนื้อหาระดับต่ำอยู่เสมอ แต่ไม่ควรกำหนดสิ่งที่คุณเลือกใช้ภาษาการเขียนโปรแกรม
Wolfgang Bangerth

0

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

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

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

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