आमतौर पर, मैं सीरियल कोड लिखता हूं, और जब मैं करता हूं, तो मैं कुछ 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 के साथ संकलित करना। लिखना भी एक समस्या नहीं होगी।
RHSFunction
और RHSJacobian
में ${PETSC_DIR}/src/ts/examples/tutorials/ex.2
) अलगाव में।