โดยปกติฉันเขียนรหัสซีเรียลและเมื่อฉันฉันเขียนการทดสอบหน่วยด้วยกรอบการทดสอบแบบ xUnit (MATLAB xUnit, PyUnit / nose หรือกรอบการทดสอบ C ++ ของ Google)
จากการค้นหาโดยคร่าวๆของ Google ฉันไม่เห็นว่าโค้ดทดสอบหน่วยผู้ปฏิบัติงานที่ใช้ MPI มากน้อยเพียงใด มีวิธีปฏิบัติที่ดีที่สุดสำหรับสิ่งนั้นหรือไม่?
เปรียบเทียบกับกลยุทธ์สำหรับการทดสอบหน่วยและการพัฒนาที่ขับเคลื่อนด้วยการทดสอบฉันกำลังมองหาคำตอบที่เกี่ยวข้องกับซอฟต์แวร์ที่ฉันควรใช้สำหรับกรอบการทดสอบ (ถ้ามี) คำตอบอาจเป็น "ม้วนรหัสของคุณเอง" ซึ่ง ตัวอย่างกรณีของรหัสการทดสอบที่กำหนดเองจะเป็นประโยชน์)
สิ่งที่ฉันกำลังมองหาเพื่อทดสอบส่วนใหญ่คือการประเมินฟังก์ชั่นทางด้านขวาและกิจวัตรประจำวันของ Jacobian matrix สำหรับเวลาที่จะรวม PDEs แบบกึ่งแยกส่วน ฉันจะใช้ PETSc ดังนั้นถ้ามีอะไรเฉพาะ PETSc ที่จะเป็นประโยชน์นอกเหนือไปจากกรอบการทดสอบทั่วไปมากขึ้น
ชี้แจงการแก้ไข:
ตัวอย่างจะอยู่ใน${PETSC_DIR}/src/ts/examples/tutorials/ex2.c
ที่ที่ฉันต้องการทดสอบบางสิ่งเช่นRHSFunction
(การประเมินฟังก์ชั่นด้านขวา) และRHSJacobian
(การประเมินเมทริกซ์จาโคเบียน) ฉันจะทดสอบกับค่าที่ทราบสำหรับด้านขวาที่ประกอบและเมทริกซ์ Jacobian ที่ประกอบขึ้น ฉันสามารถรับค่าเหล่านี้ในเชิงวิเคราะห์สำหรับอินสแตนซ์ปัญหาง่ายๆ ฟังก์ชั่นเหล่านี้เป็นฟังก์ชั่นเฉพาะแอปพลิเคชันที่จะไม่ใช้งานฟังก์ชั่นระดับแอปพลิเคชันอื่น ๆ แต่พวกเขาสามารถเรียก MPI ถ้าการประกอบเวกเตอร์หรือเมทริกซ์จะทำภายในฟังก์ชัน (เช่นในตัวอย่าง PETSc ที่เชื่อมโยงด้านบน) ถ้าฉันเขียนฟังก์ชั่นที่คำนวณเฉพาะส่วนของเวกเตอร์หรือเมทริกซ์โลคอลให้กับโปรเซสเซอร์ฉันต้องการทดสอบกับรุ่นที่รวมตัวกันทั่วโลกถ้าเป็นไปได้เนื่องจากเป็นโปรแกรมใหม่สำหรับการเขียนโปรแกรมแบบขนาน การฝึกอบรม การทดสอบเหล่านี้จะทำงานในปัญหาที่มีขนาดเล็กและโปรเซสเซอร์จำนวนเล็กน้อย
ฉันสามารถนึกถึงกลยุทธ์บางอย่างที่จะทำสิ่งนี้:
- กลยุทธ์ที่อาจทำงานได้ไม่ดีขึ้นอยู่กับการค้นหาของ Google ที่ฉันทำในหัวข้อนี้คือการสร้างผลลัพธ์ที่เป็นที่รู้จักพบข้อผิดพลาดแบบสัมพัทธ์ / สัมบูรณ์แบบขนานแล้วทำการเปรียบเทียบแบบไร้เดียงสา ผลลัพธ์อาจจะอ่านไม่ออก - ผู้ที่เขียนโปรแกรม "Hello, world" กับ MPI รู้ว่าทำไม - ซึ่ง จำกัด ยูทิลิตี้ในการทำการทดสอบหน่วย ( นี่เป็นแรงผลักดันในการถามคำถาม ) ดูเหมือนว่าจะมีความยุ่งยากในการโทรหากรอบการทดสอบหน่วยด้วย
- เขียนออกไปยังแฟ้ม (ใน PETSc ตัวอย่างเช่นการใช้
VecView
และMatView
) และเปรียบเทียบกับการส่งออกที่รู้จักกันกับสิ่งที่ต้องการหรือndiff
numdiff
ความรู้สึกของฉันด้วยวิธีนี้จากประสบการณ์ที่ผ่านมาในการทำการทดสอบหน่วยกับการเปรียบเทียบไฟล์คือว่ามันจะพิถีพิถันและจะต้องมีการกรอง วิธีนี้ดูเหมือนว่าจะยอดเยี่ยมสำหรับการทดสอบการถดถอยเนื่องจากฉันสามารถแทนที่โปรแกรมอรรถประโยชน์ด้านบนด้วยแบบธรรมดาdiff
และไม่ต้องกังวลกับการจับคู่รูปแบบข้อความ ฉันได้รวบรวมว่ากลยุทธ์นี้มากหรือน้อยสิ่งที่ WolfgangBangerth และ andybauer แนะนำ PETSc ก็ดูเหมือนจะใช้วิธีการที่คล้ายกันสำหรับการทดสอบบางอย่าง - ใช้กรอบการทดสอบหน่วยรวบรวมทุกอย่างลงในโปรเซสเซอร์ด้วย MPI อันดับ 0 และขอให้ดำเนินการทดสอบหน่วยเฉพาะเมื่ออันดับโปรเซสเซอร์เป็น 0 ฉันสามารถทำสิ่งที่คล้ายกับบรรทัดฐาน (อาจเป็นวิธีที่ง่ายกว่า) แม้ว่าการแลกเปลี่ยน คือข้อผิดพลาดใด ๆ ที่ส่งคืนจะบอกฉันว่าฉันมีปัญหาในการคำนวณของฉัน แต่ไม่ใช่องค์ประกอบใดที่มีข้อผิดพลาด จากนั้นฉันไม่ต้องกังวลเกี่ยวกับผลลัพธ์การทดสอบหน่วยใด ๆ ที่อ่านไม่ออก ฉันแค่ต้องกังวลเกี่ยวกับการโทรกรอบการทดสอบหน่วยอย่างถูกต้อง PETSc ดูเหมือนจะใช้การเปรียบเทียบแบบปกติในโปรแกรมตัวอย่างเมื่อมีคำตอบที่แน่นอน แต่ไม่ได้ใช้กรอบการทดสอบหน่วยเมื่อทำการเปรียบเทียบเหล่านั้น (และไม่ควรจำเป็น)
mpiexec
เพื่อรันและรวมถึงการเรียกเช่นPETScInitialize
/ PETScFinalize
ในรหัสการติดตั้ง / การแยก (สมมุติว่าถ้าฉันไม่ได้ใช้ PETSc ฉันจะแทนที่การโทรเหล่านั้นด้วย analogues ของMPI_Init
/ MPI_Finalize
ขึ้นอยู่กับห้องสมุดที่ฉันใช้) เฟรมเวิร์กการทดสอบของ Google เป็นรุ่นที่อิงตามซอร์สโค้ดดังนั้นรวบรวมด้วยรหัส I การเขียนก็จะไม่เป็นปัญหา
RHSFunction
และRHSJacobian
ใน${PETSC_DIR}/src/ts/examples/tutorials/ex.2
) ในการแยก