คำแนะนำใด ๆ สำหรับกรอบการทดสอบหน่วยเข้ากันได้กับรหัส / ไลบรารีที่ใช้ MPI


13

โดยปกติฉันเขียนรหัสซีเรียลและเมื่อฉันฉันเขียนการทดสอบหน่วยด้วยกรอบการทดสอบแบบ 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 ดูเหมือนจะใช้การเปรียบเทียบแบบปกติในโปรแกรมตัวอย่างเมื่อมีคำตอบที่แน่นอน แต่ไม่ได้ใช้กรอบการทดสอบหน่วยเมื่อทำการเปรียบเทียบเหล่านั้น (และไม่ควรจำเป็น)

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

พวกเขาควรจะ. ในภาษาที่คอมไพล์มันเป็นเพียงไฟล์ที่รันได้ดังนั้นจึงไม่ควรใช้mpiexecเพื่อรันและรวมถึงการเรียกเช่นPETScInitialize/ PETScFinalizeในรหัสการติดตั้ง / การแยก (สมมุติว่าถ้าฉันไม่ได้ใช้ PETSc ฉันจะแทนที่การโทรเหล่านั้นด้วย analogues ของMPI_Init/ MPI_Finalizeขึ้นอยู่กับห้องสมุดที่ฉันใช้) เฟรมเวิร์กการทดสอบของ Google เป็นรุ่นที่อิงตามซอร์สโค้ดดังนั้นรวบรวมด้วยรหัส I การเขียนก็จะไม่เป็นปัญหา
Geoff Oxberry

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

ให้ฉันเป็นรูปธรรมมากขึ้น สิ่งที่ฉันต้องการทดสอบเกี่ยวกับปัญหาเล็ก ๆ ที่มีโปรเซสเซอร์จำนวนน้อย (เช่น 1-4) จะเป็นหรือไม่ว่า Jacobian matrix ของฉันประกอบหรือไม่จริง ๆ แล้วส่งผลให้ Jacobian ทั่วโลกถูกต้องหรือไม่ ฉันต้องการทดสอบฟังก์ชั่นด้านขวาของฉันกับทางด้านขวาทั่วโลกที่รู้จัก แต่ละการทดสอบดังกล่าวยังคงควรออกกำลังกายเพียงฟังก์ชั่นเดียวในการประยุกต์ใช้ (เช่นใน PETSc ทดสอบRHSFunctionและRHSJacobianใน${PETSC_DIR}/src/ts/examples/tutorials/ex.2) ในการแยก
Geoff Oxberry

ฉันไม่คิดว่ามีกรอบในขณะนี้ที่จะช่วยให้คุณทำสิ่งที่คุณต้องการ เราพยายามบีบจมูกเพื่อทำบางสิ่งสำหรับเราใน PyClaw (และ Lisandro ใช้มันใน mpi4py และ petc4py) คุณดูที่กรอบการทดสอบใน mpich หรือไม่?
Aron Ahmadia

คำตอบ:


8

ฉันเป็นผู้ใช้ GoogleTest ที่มีความสุขด้วยรหัส C ++ MPI ในสภาพแวดล้อมการสร้าง CMake / CTest:

  • CMake ติดตั้ง / ลิงก์โดยอัตโนมัติ googletest จาก svn!
  • การทดสอบเพิ่มเป็นหนึ่งซับ!
  • การเขียนแบบทดสอบนั้นง่ายมาก! (และ Google จำลองมีประสิทธิภาพมาก!)
  • CTest สามารถส่งพารามิเตอร์บรรทัดคำสั่งไปยังการทดสอบของคุณและส่งออกข้อมูลไปยัง CDash!

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

#include <gtest/gtest.h>
#include <boost/mpi.h>

/// Most testing libraries allow to define main yourself to override initialization.
int main(int argc, char* argv[]) {
    ::testing::InitGoogleTest(&argc, argv);  /// Set gtest environment
    mpi::environment env(argc, argv);  /// Set mpi environment
    return RUN_ALL_TESTS();  /// Execute all gtest tests
}

TEST(test_batch_name, test_name) {  /// Then you can create tests as usual,
  using namespace mpi;
  communicator world;  /// and use MPI inside your tests.
  /* ... test stuff here ... */
}

CMakeLists.txt ที่เพิ่มการทดสอบนี้คือ:

add_mpi_test(my_mpi 2)  # Uses 2 MPI processes

ที่add_mpi_testล้อม CMake add_testไว้ในรูตของฉัน CMakeLists.txt:

function(add_mpi_test name no_mpi_proc)
  include_directories(${MY_TESTING_INCLUDES})
      # My test are all called name_test.cpp
      add_executable(${name} ${name}_test.cpp)
      add_dependencies(${name} googletest)
  # Make sure to link MPI here too:
  target_link_libraries(${name} ${MY_TESTING_LIBS})
  set(test_parameters ${MPIEXEC_NUMPROC_FLAG} ${no_mpi_proc} "./${name}")
      add_test(NAME ${name} COMMAND ${MPIEXEC} ${test_parameters})
endfunction(add_mpi_test)

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


4

มีแพ็คเกจซอฟต์แวร์ที่เปิดใช้งาน MPI หลายชุดซึ่งใช้ชุดเครื่องมือCMakeสำหรับการทดสอบ สิ่งที่ฉันคิดได้จากส่วนบนของหัวคือ Trilinos, VTK และ ParaView ฉันคิดว่าคุณไม่ต้องการที่จะคิดว่าจำเป็นต้องมีการปฏิบัติการที่จะเปิดตัวด้วย mpirun และ / หรือ mpiexec CMake มีการสนับสนุนสำหรับการระบุวิธีการเรียกใช้งานโปรแกรมได้อย่างถูกต้องพร้อมกับตัวเลือกที่แตกต่างกันเช่นจำนวนกระบวนการสูงสุดที่จะใช้และก่อนและหลังการตั้งค่าสถานะหากจำเป็น

คุณอาจต้องการดูที่ส่วน HPC Sites ของแดชบอร์ด ParaViewที่การทดสอบรันบนซูเปอร์คอมพิวเตอร์ NERSC และ Argonne ที่หลากหลาย ฝังอยู่ในนั้นยังมีการตั้งค่าส่วนใหญ่ที่คุณต้องระบุเพื่อให้มันทำงานบนเครื่องเหล่านั้นได้

สำหรับการอ้างอิง แดชบอร์ด Trilinosมีแพ็คเกจที่หลากหลายและฉันค่อนข้างน่าประทับใจในองค์กร

การเปิดเผยอย่างสมบูรณ์: ฉันเป็นพนักงาน Kitware และ CMake เป็นหนึ่งในโครงการโอเพ่นซอร์สที่ Kitware เกี่ยวข้องด้วย


ขอบคุณสำหรับคำตอบ! ฉันได้ดู CTest แล้วและยังไม่พบเอกสารใด ๆ นอกเหนือจากคำอธิบายแบบหน้าเพจในเว็บไซต์ KitWare คุณช่วยแนะนำการสอนที่มีอิสระได้ไหม?
Geoff Oxberry

มีพวงของข้อมูลเกี่ยวกับการเป็นวิกิพีเดีย CMake มีบทเรียนมากมายสำหรับ CMake, CTest และ CPack ผมพบว่าส่วนใหญ่ของคำตอบของฉันเพื่อการใช้งานผู้ที่อยู่ในกองมากเกิน
andybauer

andybauer - ขอบคุณสำหรับคำตอบ คุณสนใจที่จะแก้ไขคำตอบของคุณและเปิดเผยการเป็นพันธมิตรกับ KitWare ของคุณหรือไม่?
Aron Ahmadia

3

เราก็ม้วนรหัสของเราเองใน deal.II - mpirun -np ...ในสาระสำคัญที่เราบอกกรอบในการดำเนินการทดสอบการใช้ ก่อนหน้านี้เราเพิ่งใช้รูปแบบการทดสอบที่ใช้ Makefile (คอมไพล์ลิงก์ดำเนินการทดสอบจากนั้นเปรียบเทียบผลลัพธ์กับที่บันทึกไว้ก่อนหน้านี้) และคุณสามารถค้นหาได้ที่นี่:

และสำหรับบริบทเป้าหมายที่ไม่ใช่ MPI อยู่ที่นี่:

เรากำลังเขียนสิ่งใหม่โดยใช้ CMake / CTest ด้วยการพัฒนาในปัจจุบันที่นี่:


โวล์ฟกังขอบคุณสำหรับคำตอบ! PETSc ดูเหมือนจะทำสิ่งที่คล้ายกัน
Geoff Oxberry

3

ชุดทดสอบ Teuchos Unit ใน Trilinos รองรับการทดสอบตามหน่วยที่ใช้ MPI สิ่งต่าง ๆ เช่นการควบคุมผลลัพธ์จากหลาย ๆ กระบวนการและการรวม pass / fail ในทุกกระบวนการนั้นเป็นไปโดยอัตโนมัติ ลองดูสิ:

http://trilinos.org/docs/dev/packages/teuchos/doc/html/group__Teuchos__UnitTest__grp.html

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