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,
VecView
ve kullanarak PETSc'deMatView
) ve bilinen çıktıylandiff
veya gibi bir şeyle karşılaştırınnumdiff
. 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 vediff
metin 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).
mpiexec
çalıştırmak için, ve benzeri çağrıları dahil PETScInitialize
/ ' PETScFinalize
setup / 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.
RHSFunction
ve RHSJacobian
in ${PETSC_DIR}/src/ts/examples/tutorials/ex.2
) tek bir işlevi tek başına kullanmalıdır.