Biasanya, saya menulis kode seri, dan ketika saya melakukannya, saya menulis unit test dengan beberapa kerangka pengujian gaya xUnit (MATLAB xUnit, PyUnit / nose, atau kerangka pengujian C ++ Google).
Berdasarkan pencarian Google sepintas, saya belum melihat banyak tentang bagaimana praktisi menguji kode yang menggunakan MPI. Apakah ada praktik terbaik untuk itu?
Dibandingkan dengan Strategi untuk pengujian unit dan pengembangan berbasis tes , saya mencari jawaban yang berkaitan dengan perangkat lunak apa yang harus saya gunakan untuk kerangka pengujian (jika ada - jawabannya bisa "menggulung kode Anda sendiri", di mana contoh kasus kode pengujian khusus akan sangat membantu).
Sebagian besar dari apa yang saya cari untuk diuji adalah evaluasi fungsi sisi kanan dan rutinitas perakitan matriks Jacobian untuk stepper waktu yang akan mengintegrasikan PDE semi-diskritisasi. Saya akan menggunakan PETSc, jadi jika ada sesuatu yang spesifik PETSc, itu akan membantu selain kerangka pengujian yang lebih umum.
Suntingan Klarifikasi:
Contoh akan di ${PETSC_DIR}/src/ts/examples/tutorials/ex2.c
, di mana saya ingin menguji sesuatu seperti RHSFunction
(evaluasi fungsi sisi kanan) danRHSJacobian
(evaluasi matriks Jacobian). Saya akan menguji terhadap nilai-nilai yang diketahui untuk sisi kanan rakitan dan matriks Jacobian rakitan; Saya bisa mendapatkan nilai-nilai ini secara analitik untuk beberapa contoh masalah sederhana. Fungsi-fungsi ini adalah fungsi spesifik aplikasi yang tidak akan menjalankan fungsi level aplikasi lainnya, tetapi mereka bisa memanggil MPI jika perakitan vektor atau matriks dilakukan dalam fungsi tersebut (seperti dalam contoh PETSc yang ditautkan di atas). Jika saya menulis fungsi yang hanya menghitung porsi vektor atau matriks lokal ke prosesor, saya ingin menguji terhadap global, versi rakitan jika memungkinkan karena, karena baru mengenal pemrograman paralel, lebih intuitif bagi saya untuk memikirkan vektor global dan global matriks. Pengujian ini akan dijalankan pada ukuran masalah kecil dan sejumlah kecil prosesor.
Saya dapat memikirkan beberapa strategi untuk melakukan ini:
- Strategi yang mungkin tidak akan berfungsi dengan baik, berdasarkan pencarian Google yang telah saya lakukan pada topik ini, akan membangun output yang diketahui, menemukan kesalahan relatif / absolut secara paralel, dan kemudian melakukan perbandingan naif. Output mungkin akan kacau - siapa pun yang telah menulis program "Halo, dunia" dengan MPI tahu mengapa - yang membatasi utilitas melakukan pengujian unit. ( Ini adalah dorongan untuk mengajukan pertanyaan. ) Tampaknya juga ada beberapa kericuhan potensial dalam menyebut kerangka kerja unit-testing.
- Tulis output ke file (dalam PETSc, misalnya, menggunakan
VecView
danMatView
), dan bandingkan dengan output yang diketahui dengan sesuatu sepertindiff
ataunumdiff
. Perasaan saya dengan metode ini dari pengalaman sebelumnya melakukan pengujian unit dengan perbandingan file adalah bahwa itu akan rewel, dan itu akan memerlukan beberapa penyaringan. Metode ini sepertinya akan sangat baik untuk pengujian regresi, karena saya bisa mengganti utilitas di atas dengan yang sederhanadiff
, dan tidak perlu khawatir tentang mencocokkan format teks. Saya telah mengumpulkan bahwa strategi ini kurang lebih seperti yang disarankan WolfgangBangerth dan andybauer. PETSc juga tampaknya menggunakan pendekatan serupa untuk beberapa pengujian yang dilakukannya. - Gunakan kerangka kerja pengujian unit, kumpulkan semuanya ke dalam prosesor dengan MPI peringkat 0, dan mintalah untuk melakukan pengujian unit hanya jika peringkat prosesor adalah 0. Saya bisa melakukan sesuatu yang mirip dengan norma-norma (mungkin bahkan lebih mudah seperti itu), meskipun untungnya adalah bahwa setiap kesalahan yang dikembalikan akan memberi tahu saya bahwa saya memiliki masalah dalam perhitungan saya, tetapi bukan elemen mana yang salah. Maka saya tidak perlu khawatir tentang output pengujian unit yang kacau; Saya hanya perlu khawatir tentang memanggil kerangka pengujian unit dengan benar. PETSc tampaknya menggunakan perbandingan norm-wise dalam program contohnya ketika solusi yang tepat tersedia, tetapi ia tidak menggunakan kerangka pengujian unit saat membuat perbandingan tersebut (juga tidak harus, tentu saja).
sumber
mpiexec
, dan termasuk panggilan sepertiPETScInitialize
/PETScFinalize
dalam kode setup / teardown. (Mungkin, jika saya tidak menggunakan PETSc, saya akan mengganti panggilan itu dengan analog dariMPI_Init
/MPI_Finalize
, tergantung pada perpustakaan yang saya gunakan.) Kerangka pengujian Google adalah rilis berbasis sumber, jadi kompilasi bersama dengan kode I menulis juga tidak akan menjadi masalah.RHSFunction
danRHSJacobian
dalam${PETSC_DIR}/src/ts/examples/tutorials/ex.2
) secara terpisah.Jawaban:
Saya pengguna senang GoogleTest dengan kode C ++ MPI di lingkungan build CMake / CTest:
Begini Cara kerjanya. Sekumpulan unit-test yang membutuhkan mpi ditulis ke dalam beberapa
my_mpi_test.cpp
file yang terlihat seperti ini:CMakeLists.txt yang menambahkan tes ini adalah:
di mana
add_mpi_test
membungkus CMake diadd_test
dalam CMakeLists.txt root saya:Bagian terakhir ini tidak perlu tetapi memungkinkan Anda untuk dengan mudah menambahkan tes mpi dalam satu baris. Kemudian Anda dapat memutuskan apakah Anda ingin melakukan hard-code angka proses MPI untuk setiap tes atau membacanya melalui parameter baris perintah ke ctest.
sumber
Ada beberapa paket perangkat lunak berkemampuan MPI yang menggunakan set alat CMake untuk pengujian. Yang bisa saya pikirkan adalah Trilinos, VTK dan ParaView. Saya akan berpikir bahwa Anda tidak ingin berasumsi bahwa executable perlu diluncurkan dengan mpirun dan / atau mpiexec. CMake memiliki dukungan untuk menentukan cara meluncurkan executable yang tepat bersama dengan opsi yang berbeda seperti jumlah maksimum proses untuk digunakan dan pra-dan pasca-bendera, jika diperlukan.
Anda mungkin ingin melihat bagian Situs HPC pada dasbor ParaView tempat pengujian dijalankan pada berbagai superkomputer NERSC dan Argonne. Dikubur di sana juga sebagian besar pengaturan yang harus Anda tentukan untuk membuatnya bekerja pada mesin-mesin itu.
Sebagai referensi, dasbor Trilinos memiliki beragam paket yang terdaftar dan bagi saya agak mengesankan di organisasinya.
Pengungkapan penuh: Saya seorang karyawan Kitware dan CMake adalah salah satu proyek sumber terbuka yang terlibat dengan Kitware.
sumber
Kami hanya menggulung kode kami sendiri. II - pada dasarnya, kami memberi tahu kerangka kerja untuk melakukan tes menggunakan
mpirun -np ...
. Kami sebelumnya hanya menggunakan skema pengujian berbasis Makefile (kompilasi, tautkan, jalankan pengujian, lalu bandingkan hasilnya dengan yang sebelumnya telah disimpan) dan Anda dapat menemukannya di sini:dan untuk konteks, target non-MPI ada di sini:
Kami menulis ulang hal-hal menggunakan CMake / CTest, dengan perkembangan saat ini di sini:
sumber
Rangkaian uji Unit Teuchos di Trilinos secara asli mendukung tes unit yang menggunakan MPI. Hal-hal seperti mengendalikan output dari berbagai proses dan agregat lulus / gagal atas semua proses otomatis. Lihatlah:
http://trilinos.org/docs/dev/packages/teuchos/doc/html/group__Teuchos__UnitTest__grp.html
sumber