यूनिट-टेस्टिंग फ्रेमवर्क के लिए कोई सिफारिश जो कोड / पुस्तकालयों के साथ संगत है जो एमपीआई का उपयोग करते हैं?


13

आमतौर पर, मैं सीरियल कोड लिखता हूं, और जब मैं करता हूं, तो मैं कुछ xUnit- शैली परीक्षण ढांचे (MATLAB xUnit, PyUnit / nose, या Google के C ++ परीक्षण ढांचे) के साथ इकाई परीक्षण लिखता हूं।

एक सरसरी तौर पर Google खोज के आधार पर, मैंने यह नहीं देखा कि MPI का उपयोग करने वाले चिकित्सकों की इकाई परीक्षण कोड कैसे है। क्या इसके लिए कोई सर्वोत्तम प्रथाएं हैं?

इकाई परीक्षण और परीक्षण-संचालित विकास के लिए रणनीतियों की तुलना में , मैं परीक्षण ढांचे के लिए मुझे किस सॉफ्टवेयर का उपयोग करना चाहिए, इससे संबंधित उत्तर की तलाश कर रहा हूं (यदि कोई मौजूद है - तो जवाब बहुत अच्छी तरह से "अपना कोड रोल कर सकता है", जिसमें कस्टम परीक्षण कोड के मामले उदाहरण सहायक होंगे)।

मैं जो परीक्षण करना चाहता हूं, उनमें से अधिकांश दाएं हाथ के कार्य मूल्यांकन और जैकबियन मैट्रिक्स असेंबली रूट टाइम स्टीपर के लिए हैं जो अर्ध-विच्छेदित पीडीई को एकीकृत करेंगे। मैं PETSc का उपयोग करूंगा, इसलिए यदि PETSc- कुछ भी विशिष्ट है, तो यह अधिक सामान्य परीक्षण ढांचे के अतिरिक्त सहायक होगा।

स्पष्टीकरण संपादन:

एक उदाहरण इसमें होगा ${PETSC_DIR}/src/ts/examples/tutorials/ex2.c, जहां मैं कुछ परीक्षण करना चाहूंगा जैसे RHSFunction(दाएं हाथ का कार्य मूल्यांकन) औरRHSJacobian(एक याकूबियन मैट्रिक्स मूल्यांकन)। मैं इकट्ठे दाएँ हाथ की ओर और इकट्ठे याकूब मैट्रिक्स के लिए ज्ञात मूल्यों के खिलाफ परीक्षण करूँगा; मैं कुछ साधारण समस्या उदाहरणों के लिए इन मूल्यों को विश्लेषणात्मक रूप से प्राप्त कर सकता हूं। ये फ़ंक्शन अनुप्रयोग-विशिष्ट फ़ंक्शन हैं जो किसी अन्य एप्लिकेशन-स्तरीय फ़ंक्शन का उपयोग नहीं करेंगे, लेकिन वे MPI को कॉल कर सकते हैं यदि वेक्टर या मैट्रिक्स असेंबली फ़ंक्शन के भीतर किया जाता है (जैसा कि ऊपर लिंक किए गए PETSc उदाहरण में)। अगर मैं ऐसे कार्यों को लिखता हूं जो केवल एक प्रोसेसर के लिए वैक्टर या मैट्रिसेस के हिस्से की गणना करते हैं, तो मैं संभव हो तो वैश्विक, इकट्ठे संस्करण के खिलाफ परीक्षण करना चाहता हूं, क्योंकि समानांतर प्रोग्रामिंग के लिए नया होने के नाते, वैश्विक वैक्टर और वैश्विक के बारे में सोचना मेरे लिए अधिक सहज है। मैट्रिक्स। ये परीक्षण छोटी समस्या आकार और प्रोसेसर की छोटी संख्या पर चलाया जाएगा।

मैं ऐसा करने के लिए कुछ रणनीतियों के बारे में सोच सकता हूं:

  • एक रणनीति जो संभवतः अच्छी तरह से काम नहीं करेगी, इस विषय पर Google खोजों के आधार पर, मैं एक ज्ञात आउटपुट का निर्माण करने के लिए होगा, समानांतर में रिश्तेदार / पूर्ण त्रुटि का पता लगाऊंगा, और फिर भोली तुलना करूंगा। आउटपुट शायद गरबा हो जाएगा - कोई भी जिसने MPI के साथ "हैलो, वर्ल्ड" प्रोग्राम लिखा है, वह जानता है कि क्यों - जो इकाई परीक्षण करने की उपयोगिता को सीमित करता है। ( यह सवाल पूछने की प्रेरणा थी। ) यूनिट-टेस्टिंग फ्रेमवर्क को कॉल करने में कुछ संभावित चालाकी भी प्रतीत होती है।
  • फाइल करने के लिए आउटपुट लिखें (उदाहरण के लिए, पीईटीएससी में, उपयोग VecViewऔर MatView), और कुछ जैसे ndiffया के साथ ज्ञात आउटपुट के खिलाफ तुलना करें numdiff। फ़ाइल तुलना के साथ इकाई परीक्षण करने के पिछले अनुभव से इस विधि के साथ मेरी आंत महसूस कर रही है कि यह नकचढ़ा होगा, और इसे बिना किसी फ़िल्टरिंग की आवश्यकता होगी। यह विधि ऐसा लगता है कि यह प्रतिगमन परीक्षण के लिए उत्कृष्ट होगा, हालांकि, क्योंकि मैं उपर्युक्त उपयोगिताओं को एक सादे से बदल सकता हूं diff, और पाठ प्रारूपों के मिलान के बारे में चिंता करने की आवश्यकता नहीं है। मैंने पाया है कि यह रणनीति कमोबेश वोल्फगैंगबैंगर्थ और एंडबॉयर सुझाव दे रही है। पेट्सक भी कुछ परीक्षण के लिए इसी तरह के दृष्टिकोण का उपयोग करता दिखाई देता है।
  • एक यूनिट टेस्टिंग फ्रेमवर्क का उपयोग करें, MPI रैंक 0 के साथ प्रोसेसर पर सब कुछ इकट्ठा करें, और इसे यूनिट परीक्षणों को निष्पादित करने के लिए कहें, यदि प्रोसेसर रैंक 0. है। मैं मानदंडों के साथ भी ऐसा ही कुछ कर सकता हूं (हालांकि यह शायद उतना आसान है), हालांकि ट्रेडऑफ़ क्या यह है कि किसी भी त्रुटि के कारण मुझे पता चलेगा कि मुझे अपनी गणना में समस्या है, लेकिन यह नहीं कि कौन से तत्व त्रुटि में हैं। फिर मुझे किसी भी इकाई परीक्षण उत्पादन के बारे में चिंता करने की आवश्यकता नहीं है; मुझे केवल यूनिट टेस्टिंग फ्रेमवर्क को सही ढंग से कॉल करने के बारे में चिंता करने की आवश्यकता है। पेट्सक सटीक उदाहरण उपलब्ध होने पर अपने उदाहरण कार्यक्रमों के भीतर आदर्श-वार तुलनाओं का उपयोग करता प्रतीत होता है, लेकिन यह उन तुलनाओं को बनाते समय एक इकाई परीक्षण ढांचे का उपयोग नहीं करता है (न ही यह आवश्यक होना चाहिए)।

मैं केवल इन-हाउस परीक्षण सूट से परिचित हूं, इसलिए मैं कुछ भी सुझा नहीं सकता। कहा जा रहा है कि, इनमें से कोई भी परीक्षण सूट आपको यह निर्दिष्ट करने की अनुमति नहीं देता है कि आपके द्वारा बनाए गए निष्पादन योग्य को कैसे चलाया जाए? यदि वे करते हैं, तो यह परीक्षण करने के लिए तुच्छ होना चाहिए जो एमपीआई कार्यक्रमों के लिए काम करते हैं।
बिल बर्थ

वे चाहिए। किसी भी संकलित भाषा में, यह सिर्फ एक निष्पादन योग्य है, इसलिए इसे mpiexecचलाने के लिए उपयोग करने के लिए कोई समस्या नहीं होनी चाहिए , और सेटअप / फाड़ कोड में PETScInitialize/ जैसे कॉल शामिल करना चाहिए PETScFinalize। (संभवतः, अगर मैं PETSc का उपयोग नहीं कर रहा था, तो मैं उन कॉल्स को MPI_Init/ के एनालॉग्स के साथ बदल दूंगा, जिन MPI_Finalizeपुस्तकालयों का मैं उपयोग कर रहा हूं, उनके आधार पर।) Google का परीक्षण ढांचा एक स्रोत-आधारित रिलीज़ है, इसलिए इसे कोड I के साथ संकलित करना। लिखना भी एक समस्या नहीं होगी।
ज्योफ ऑक्सबेरी

समस्या का आपका वर्णन मुझे बताता है कि आप एकीकरण / प्रतिगमन परीक्षण चलाने के लिए एक इकाई-परीक्षण ढांचे का उपयोग करने में रुचि रखते हैं। वहाँ प्रति se के साथ कुछ भी गलत नहीं है, लेकिन आप अपने प्रश्न को थोड़ा और स्पष्ट करना चाह सकते हैं। मुझे लगता है कि अगर आपने एक इकाई परीक्षण विशेषज्ञ से पूछा कि अपने वैज्ञानिक कोड के लिए इकाई परीक्षण कैसे लिखें, तो वे आपको मॉड्यूलर तरीके से परीक्षण लिखने के लिए कहेंगे। यही है, आपके अधिकांश परीक्षणों में उनमें उचित MPI कॉल नहीं होंगे।
अरोन अहमदिया

मुझे और ठोस होने दो। कुछ मैं एक छोटी सी समस्या पर एक छोटी संख्या के प्रोसेसर के साथ परीक्षण करना चाहता हूं (जैसे, 1-4) यह होगा कि मेरे इकट्ठे जैकबियन मैट्रिक्स वास्तव में उचित वैश्विक जैकबियन में परिणाम करते हैं या नहीं। मैं अपने दाहिने हाथ के कार्य का परीक्षण एक ज्ञात वैश्विक दाएँ हाथ की ओर करना चाहता हूँ। इस तरह के प्रत्येक परीक्षण को अभी भी आवेदन में एक ही कार्य करना चाहिए (उदाहरण के लिए, PETSc में, परीक्षण RHSFunctionऔर RHSJacobianमें ${PETSC_DIR}/src/ts/examples/tutorials/ex.2) अलगाव में।
जियोफ ऑक्सीबेरी

मुझे नहीं लगता कि वर्तमान में ऐसा कोई ढांचा मौजूद है जो आपको वह करने में मदद करने जा रहा है जो आप चाहते हैं। हम PyClaw में हमारे लिए कुछ चीजें करने में नाक में दम करने में कामयाब रहे हैं, (और लिसेंड्रो ने इसका उपयोग mpi4py और Petsc4py में किया है)। क्या आपने mpich में परीक्षण ढांचे को देखा है?
एरन अहमदिया

जवाबों:


8

मैं CMT / CTest बिल्ड वातावरण में C ++ MPI कोड के साथ GoogleTest का एक खुश उपयोगकर्ता हूं:

  • CMake स्वचालित रूप से svn से googletest को स्थापित / लिंक करता है!
  • परीक्षण जोड़ना एक-लाइनर है!
  • परीक्षण लिखना आसान है! (और गूगल मॉक बहुत शक्तिशाली है!)
  • CTEST आपके परीक्षणों के लिए कमांड-लाइन पैरामीटर पारित कर सकता है, और डेटा को निर्यात कर सकता है!

यह इस तरह काम करता है। यूनिट-परीक्षणों के एक बैच की आवश्यकता होती है 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के 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 सेट का उपयोग करते हैं । जो मैं अपने सिर के ऊपर से सोच सकता हूं वे हैं त्रिलीनोस, वीटीके और पैराव्यू। मुझे लगता है कि आप यह नहीं मानना ​​चाहते हैं कि निष्पादन योग्य जरूरतों को mpirun और / या mpiexec के साथ लॉन्च किया जाना चाहिए। सीएमके को यह निर्दिष्ट करने के लिए समर्थन है कि विभिन्न विकल्पों जैसे कि उपयोग करने के लिए प्रक्रियाओं की अधिकतम संख्या और पूर्व और बाद के झंडे के साथ निष्पादन योग्य को ठीक से कैसे लॉन्च किया जाए, यदि आवश्यक हो।

आप पैराव्यू डैशबोर्ड के एचपीसी साइट्स अनुभाग को देखना चाहते हैं, जहां विभिन्न प्रकार के एनईआरसी और आर्गन सुपर कंप्यूटर पर परीक्षण चलाए जाते हैं। वहाँ भी दफन कर रहे हैं कि आप उन मशीनों पर काम करने के लिए निर्दिष्ट करने की आवश्यकता होगी कि ज्यादातर सेटिंग्स हैं।

संदर्भ के लिए, Trilinos डैशबोर्ड में सूचीबद्ध पैकेज की एक विस्तृत विविधता है और मेरे लिए इसके संगठन में प्रभावशाली है।

पूर्ण प्रकटीकरण: मैं एक किटवेयर कर्मचारी हूं और सीएमके ओपन सोर्स परियोजनाओं में से एक है जो कि किटवेयर के साथ शामिल है।


जवाब के लिए धन्यवाद! मैं CTest देख रहा हूं, और किवारे वेब साइट पर एक पेज-लाइक विवरण से अलग किसी भी दस्तावेज पर नहीं आया हूं। आप किसी भी स्वतंत्र रूप से उपलब्ध ट्यूटोरियल की सिफारिश कर सकते हैं?
ज्योफ ऑक्सीबेरी

सीएमके विकी पर जानकारी का एक गुच्छा है । वहां सीएमके, सीटेस्ट और सीपीएके के लिए ट्यूटोरियल का एक समूह है। मुझे लगता है कि स्टैक ओवरफ्लो पर उन अनुप्रयोगों के लिए मेरे जवाब के अधिकांश ।
एंडबॉयर

andybauer - उत्तर के लिए धन्यवाद। क्या आप अपने जवाब को संपादित करने और किटवेयर के साथ अपनी संबद्धता का खुलासा करने का मन बनाते हैं?
एरन अहमदिया

3

हम सीधे डील में अपना कोड रोल करते हैं। II - संक्षेप में, हम परीक्षण का उपयोग करने के लिए रूपरेखा को बताते हैं mpirun -np ...। हमने पहले मेकफाइल-आधारित परीक्षण योजना का उपयोग किया था (संकलन, लिंक, परीक्षण निष्पादित करें, फिर उस आउटपुट की तुलना करें जो पहले सहेजा गया था) और आप इसे यहां पा सकते हैं:

और संदर्भ के लिए, गैर-एमपीआई लक्ष्य यहां हैं:

हम यहां वर्तमान विकास के साथ CMake / CTest का उपयोग करके चीजों को फिर से लिख रहे हैं:


वोल्फगैंग, उत्तर के लिए धन्यवाद! पेट्सक भी कुछ ऐसा ही कर रहा है।
ज्योफ ऑक्सीबेरी

3

ट्रिलिनो में टेचुकोस यूनिट परीक्षण हार्नेस MPI का उपयोग करने वाली इकाई परीक्षणों का मूल रूप से समर्थन करता है। कई प्रक्रियाओं से आउटपुट को नियंत्रित करने और सभी प्रक्रियाओं पर पास / फेल करने जैसी चीजें स्वचालित हैं। जरा देखो तो:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.