MPI kullanan kod / kitaplıklarla uyumlu birim sınama çerçeveleri için herhangi bir öneriniz var mı?


13

Genellikle, seri kodu yazıyorum ve bunu yaptığımda bazı xUnit tarzı test çerçevesiyle (MATLAB xUnit, PyUnit / nose veya Google'ın C ++ test çerçevesi) birim testleri yazıyorum.

Bir cursory Google aramasına dayanarak, uygulayıcıların MPI kullanan test kodunu nasıl kullandığını çok fazla görmedim. Bunun için en iyi uygulamalar var mı?

Birim testi ve test odaklı geliştirme stratejileri ile karşılaştırıldığında, bir test çerçevesi için hangi yazılımı kullanmam gerektiğiyle ilgili cevaplar arıyorum (varsa - cevap çok iyi "kendi kodunuzu döndürün") özel test kodunun durum örnekleri yararlı olabilir).

Test etmek istediğim şeylerin çoğu sağ taraf fonksiyon değerlendirmeleri ve yarı ayrıklaştırılmış PDE'leri entegre edecek zaman kademeleri için Jacobian matris montaj rutinleri. PETSc kullanacağım, bu yüzden PETSc'ye özgü bir şey varsa, daha genel test çerçevelerine ek olarak yardımcı olacaktır.

Açıklama Düzenlemeleri:

Bir örnek ${PETSC_DIR}/src/ts/examples/tutorials/ex2.c, RHSFunction(sağ taraftaki fonksiyon değerlendirmesi) gibi bir şeyi test etmek istediğim yerdi veRHSJacobian(Jacobian matris değerlendirmesi). Toplanmış sağ taraf ve toplanmış Jacobian matrisi için bilinen değerlere karşı test ediyorum; Bazı basit problem örnekleri için bu değerleri analitik olarak elde edebilirim. Bu işlevler, başka bir uygulama düzeyi işlevini uygulamayan uygulamaya özgü işlevlerdir, ancak işlev içinde vektör veya matris montajı yapılırsa MPI'yi çağırabilir (yukarıdaki bağlantılı PETSc örneğinde olduğu gibi). Bir işlemciye yalnızca vektör veya matris bölümlerini yerel olarak hesaplayan işlevler yazarsam, mümkünse küresel, birleştirilmiş sürüme karşı test etmek isterim, çünkü paralel programlamaya yeni geldiğimde, küresel vektörleri ve küresel düşünmek benim için daha sezgisel matrisler. Bu testler küçük problem boyutları ve az sayıda işlemci üzerinde yapılacaktır.

Bunu yapmak için birkaç strateji düşünebilirim:

  • Bu konuda yaptığım Google aramalarına dayanarak muhtemelen iyi çalışmayan bir strateji, bilinen bir çıktı oluşturmak, göreceli / mutlak hatayı paralel olarak bulmak ve daha sonra naif karşılaştırmalar yapmak olacaktır. Çıktı muhtemelen karışık olacaktır - MPI ile "Merhaba, dünya" programı yazmış olan herkes nedenini bilir - bu da birim testi yapmanın faydasını sınırlar. ( Bu, soruyu sormak için bir itici güçtü . ) Birim testi çerçevesini çağırmanın potansiyel bir hilesi de var gibi görünüyor.
  • Çıktıyı dosyaya yazın (örneğin, VecViewve kullanarak PETSc'de MatView) ve bilinen çıktıyla ndiffveya gibi bir şeyle karşılaştırın numdiff. Dosya karşılaştırmaları ile birim testi yapan önceki deneyimlerden gelen bu yöntemle bağırsak hissim, titiz olması ve bazı filtreleme gerektirmesidir. Bu yöntem, regresyon testi için mükemmel gibi görünüyor, çünkü yukarıdaki yardımcı programları bir düzle değiştirebilirim ve diffmetin formatlarını eşleştirme konusunda endişelenmemeliyim. WolfgangBangerth ve andybauer'in bu stratejinin aşağı yukarı önerdiklerini topladım. PETSc, yaptığı bazı testler için de benzer bir yaklaşım kullanıyor gibi görünmektedir.
  • Birim sınama çerçevesi kullanın, MPI sıra 0 ile her şeyi işlemcinin üzerine toplayın ve yalnızca işlemci sıra 0 ise birim sınamalarını yürütmesini isteyin. Döndürülen hataların bana hesaplamamda bir sorunum olduğunu söyleyecek, ancak hangi öğelerin hatalı olduğunu söylemeyecek. O zaman herhangi bir birim test çıkışı bozuk hakkında endişelenmenize gerek yok; Sadece birim test çerçevesini doğru bir şekilde çağırmaktan endişelenmem gerekiyor. PETSc, kesin çözümler mevcut olduğunda örnek programlarında norm-bilge karşılaştırmalar kullanıyor gibi görünmektedir, ancak bu karşılaştırmaları yaparken bir birim test çerçevesi kullanmamaktadır (zorunlu olarak).

Sadece şirket içi test paketlerine aşinayım, bu yüzden hiçbir şey öneremem. Bununla birlikte, bu test paketlerinin hiçbiri, oluşturduğunuz yürütülebilir dosyayı nasıl çalıştıracağınızı belirtmenize izin vermiyor mu? Eğer öyleyse, MPI programları için çalışan testler yapmak önemsiz olmalıdır.
Bill Barth

Yapmalılar. Bu sorun kullanmak olmalıdır yüzden herhangi derlenen bir dil olarak, sadece bir çalıştırılabilir var mpiexecçalıştırmak için, ve benzeri çağrıları dahil PETScInitialize/ ' PETScFinalizesetup / söküm kodunda. (Muhtemelen, PETSc kullanmıyorsam, bu aramaları kullandığım kütüphanelere bağlı olarak MPI_Init/ / analogları ile değiştirirdim MPI_Finalize.) Google'ın test çerçevesi kaynak tabanlı bir sürümdür, bu yüzden kodla birlikte derlerim yazma da sorun olmaz.
Geoff Oxberry

Sorunla ilgili açıklamanız bana entegrasyon / regresyon testlerini çalıştırmak için birim testi çerçevesi kullanmakla ilgilendiğinizi gösteriyor. Bu konuda yanlış bir şey yok, ancak sorunuzu biraz daha açıklığa kavuşturmak isteyebilirsiniz. Bir birim test uzmanına bilimsel kodunuz için birim testleri nasıl yazacağınızı sorarsanız, size modüler bir şekilde test yazmanızı söylerler. Yani, testlerinizin çoğunda uygun MPI çağrıları olmazdı.
Aron Ahmadia

Daha somut olalım. Az sayıda işlemciyle (diyelim 1-4) küçük bir problem üzerinde test etmek isteyeceğim bir şey, bir araya getirilmiş Jacobian matrisimin gerçekten uygun küresel Jacobian ile sonuçlanıp sonuçlanmayacağı olacaktır. Ayrıca sağ taraftaki fonksiyonumu bilinen bir küresel sağ tarafa karşı test etmek istiyorum. Bu tür testlerin her biri, uygulamada (örneğin, PETSc, test RHSFunctionve RHSJacobianin ${PETSC_DIR}/src/ts/examples/tutorials/ex.2) tek bir işlevi tek başına kullanmalıdır.
Geoff Oxberry

Şu anda istediğinizi yapmanıza yardımcı olacak bir çerçeve olduğunu düşünmüyorum. PyClaw'da burnumuzu bizim için birkaç şey yapmaya yöneltmeyi başardık (ve Lisandro mpi4py ve petsc4py'de kullandı). MPich'teki test çerçevesine baktınız mı?
Aron Ahmadia

Yanıtlar:


8

CMake / CTest oluşturma ortamında C ++ MPI koduyla GoogleTest'in mutlu bir kullanıcısıyım:

  • CMake svn'den googletest'i otomatik olarak kurar / bağlar!
  • test ekleme tek astarlıdır!
  • testleri yazmak çok kolay! (ve google sahte çok güçlü!)
  • CTest, komut satırı parametrelerini testlerinize iletebilir ve verileri CDash'a aktarabilir!

Bu nasıl çalışır. Mpi gerektiren bir grup birim sınama my_mpi_test.cppaşağıdaki gibi bir dosyaya yazılır :

#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 ... */
}

Bu testi ekleyen CMakeLists.txt dosyası:

add_mpi_test(my_mpi 2)  # Uses 2 MPI processes

nerede add_mpi_testCMake add_testkök CMakeLists.txt içinde sarar :

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)

Bu son bölüm gerekli değildir, ancak bir satıra kolayca mpi testleri eklemenizi sağlar. Daha sonra, her test için MPI işlemlerinin sayısını sabit kodlamak isteyip istemediğinize karar verebilir veya test etmek için bir komut satırı parametresi ile okuyabilirsiniz.


4

CMake test araçlarını kullanan birkaç MPI özellikli yazılım paketi vardır . Başımın üstünde düşünebileceğim şeyler Trilinos, VTK ve ParaView. Yürütülebilir dosyanın mpirun ve / veya mpiexec ile başlatılması gerektiğini varsaymak istemediğinizi düşünürüm. CMake, kullanılacak maksimum işlem sayısı ve gerekirse bayraklar öncesi ve sonrası gibi farklı seçeneklerle birlikte yürütülebilir dosyanın nasıl düzgün başlatılacağını belirleme desteğine sahiptir.

Testlerin çeşitli NERSC ve Argonne süper bilgisayarlarında yapıldığı ParaView kontrol panelinin HPC Siteleri bölümüne bakmak isteyebilirsiniz . Ayrıca, bu makinelerde çalışmasını sağlamak için belirtmeniz gereken ayarların çoğu da gömülüdür.

Referans olarak, Trilinos panosunda listelenen çok çeşitli paketler var ve benim için organizasyonunda oldukça etkileyici.

Tam açıklama: Bir Kitware çalışanıyım ve CMake, Kitware'in dahil olduğu açık kaynak projelerinden biridir.


Cevap için teşekkürler! CTest'e bakıyordum ve KitWare web sitesinde man-page benzeri bir açıklama dışında herhangi bir belgeye rastlamadım. Serbestçe kullanılabilir herhangi bir öğretici tavsiye edebilir misiniz?
Geoff Oxberry

CMake wiki hakkında bir sürü bilgi var . Orada CMake, CTest ve CPack için bir sürü ders var. Bu uygulamalara verdiğim yanıtların çoğunu Stack Overflow'da buluyorum .
andybauer

andybauer - Cevabınız için teşekkürler. Yanıtınızı düzenlemek ve KitWare ile olan ilişkinizi açıklamak ister misiniz?
Aron Ahmadia

3

Sadece kendi kodumuzu anlaşıyoruz. II - özünde, testleri kullanarak yürütme çerçevesini anlatıyoruz mpirun -np .... Daha önce sadece Makefile tabanlı bir test şeması kullandık (derleme, bağlantı, yürütme testi, daha sonra çıktıyı daha önce kaydedilmiş olanla karşılaştırın) ve bunu burada bulabilirsiniz:

ve bağlam için, ÇBYE dışı hedefler burada:

CMake / CTest kullanarak işleri burada yeniden yazıyoruz:


Wolfgang, cevap için teşekkürler! PETSc benzer bir şey yapıyor gibi görünüyor.
Geoff Oxberry

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.