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).
mpiexec
, dan termasuk panggilan seperti PETScInitialize
/ PETScFinalize
dalam kode setup / teardown. (Mungkin, jika saya tidak menggunakan PETSc, saya akan mengganti panggilan itu dengan analog dari MPI_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
dan RHSJacobian
dalam ${PETSC_DIR}/src/ts/examples/tutorials/ex.2
) secara terpisah.