क्या आर्मडिल्लो हल () धागा सुरक्षित है?


86

मेरे कोड में मेरे पास लूप है जिसमें मैं निर्माण करता हूं और निर्धारित रैखिक प्रणाली से अधिक है और इसे हल करने का प्रयास करता हूं:

#pragma omp parallel for
for (int i = 0; i < n[0]+1; i++) {
    for (int j = 0; j < n[1]+1; j++) {
        for (int k = 0; k < n[2]+1; k++) {
            arma::mat A(max_points, 2);
            arma::mat y(max_points, 1);
            // initialize A and y

            arma::vec solution = solve(A,y);
        }
    }
}

कभी-कभी, काफी बेतरतीब ढंग से प्रोग्राम हैंग हो जाता है या सॉल्यूशन वेक्टर में परिणाम NaN होते हैं। और अगर मैं ऐसा करूं:

arma::vec solution;
#pragma omp critical 
{
    solution = solve(weights*A,weights*y);
}

तब ये समस्या अब नहीं लगती है।

जब यह लटका होता है, तो ऐसा इसलिए होता है क्योंकि कुछ थ्रेड OpenMP बैरियर पर प्रतीक्षा कर रहे हैं:

Thread 2 (Thread 0x7fe4325a5700 (LWP 39839)):
#0  0x00007fe44d3c2084 in gomp_team_barrier_wait_end () from /usr/lib64/gcc-4.9.2/lib64/gcc/x86_64-redhat-linux-gnu/4.9.2/libgomp.so.1
#1  0x00007fe44d3bf8c2 in gomp_thread_start () at ../.././libgomp/team.c:118
#2  0x0000003f64607851 in start_thread () from /lib64/libpthread.so.0
#3  0x0000003f642e890d in clone () from /lib64/libc.so.6

और दूसरे धागे आर्मैडिलो के अंदर फंस गए हैं:

Thread 1 (Thread 0x7fe44afe2e60 (LWP 39800)):
#0  0x0000003ee541f748 in dscal_ () from /usr/lib64/libblas.so.3
#1  0x00007fe44c0d3666 in dlarfp_ () from /usr/lib64/atlas/liblapack.so.3
#2  0x00007fe44c058736 in dgelq2_ () from /usr/lib64/atlas/liblapack.so.3
#3  0x00007fe44c058ad9 in dgelqf_ () from /usr/lib64/atlas/liblapack.so.3
#4  0x00007fe44c059a32 in dgels_ () from /usr/lib64/atlas/liblapack.so.3
#5  0x00007fe44f09fb3d in bool arma::auxlib::solve_ud<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> >(arma::Mat<double>&, arma::Mat<double>&, arma::Base<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> > const&) () at /usr/include/armadillo_bits/lapack_wrapper.hpp:677
#6  0x00007fe44f0a0f87 in arma::Col<double>::Col<arma::Glue<arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::glue_solve> >(arma::Base<double, arma::Glue<arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::glue_solve> > const&) ()
at /usr/include/armadillo_bits/glue_solve_meat.hpp:39

जैसा कि आप स्टैट्रेस से देख सकते हैं कि आर्मडिलो का मेरा संस्करण एटलस का उपयोग करता है। और इस दस्तावेज के अनुसार एटलस थ्रेड सुरक्षित प्रतीत होता है: ftp://lsec.cc.ac.cn/netlib/atlas/faq.html#tsafe

अपडेट 9/11/2015

मुझे आखिरकार व्लादिमीर एफ के सुझावों के आधार पर, अधिक परीक्षण चलाने के लिए कुछ समय मिला।

जब मैं एटलस के BLAS के साथ आर्मैडिलो संकलित करता हूं, तब भी मैं फिर से लटकने में सक्षम होता हूं और NaNs। जब यह लटका रहता है, केवल एक चीज जो स्टैकट्रेस में बदलती है, वह है BLAS:

#0  0x0000003fa8054718 in ATL_dscal_xp1yp0aXbX@plt () from /usr/lib64/atlas/libatlas.so.3
#1  0x0000003fb05e7666 in dlarfp_ () from /usr/lib64/atlas/liblapack.so.3
#2  0x0000003fb0576a61 in dgeqr2_ () from /usr/lib64/atlas/liblapack.so.3
#3  0x0000003fb0576e06 in dgeqrf_ () from /usr/lib64/atlas/liblapack.so.3
#4  0x0000003fb056d7d1 in dgels_ () from /usr/lib64/atlas/liblapack.so.3
#5  0x00007ff8f3de4c34 in void arma::lapack::gels<double>(char*, int*, int*, int*, double*, int*, double*, int*, double*, int*, int*) () at /usr/include/armadillo_bits/lapack_wrapper.hpp:677
#6  0x00007ff8f3de1787 in bool arma::auxlib::solve_od<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> >(arma::Mat<double>&, arma::Mat<double>&, arma::Base<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> > const&) () at /usr/include/armadillo_bits/auxlib_meat.hpp:3434

ATLAS के बिना संकलन, केवल netlib BLAS और LAPACK के साथ, मैं NaN को पुन: उत्पन्न करने में सक्षम था, लेकिन हैंग नहीं।

दोनों ही मामलों में, ऑप्स क्रिटिकल के solve()साथ #pragmaमुझे कोई समस्या नहीं है


1
क्या /usr/lib64/libblas.so.3 एटलस का हिस्सा है? यह / usr / lib64 / एटलस में क्यों नहीं स्थित है?
व्लादिमीर एफ

1
नहीं, खुलने के समय यह पैकेज liblas3 का हिस्सा है और पुनर्वितरण में यह पैकेज blas का हिस्सा है।
मैक्सडबायसर

2
जब आप डिफ़ॉल्ट BLAS का उपयोग करते हैं तब आप ATLAS की किसी भी गारंटी का उपयोग नहीं कर सकते हैं।
व्लादिमीर एफ

2
क्या आपने इसका हल निकाला है? यदि नहीं, तो कौन से पैकेज स्थापित हैं, और क्या आप प्रोग्राम को संकलित करने के लिए उपयोग की जाने वाली कमांड पोस्ट कर सकते हैं?
vindvaki

3
आप एटलस के बजाय ओपनबीएलएएस का उपयोग करने का भी प्रयास कर सकते हैं ।
mtall

जवाबों:


2

क्या आप सुनिश्चित हैं कि आपके सिस्टम निर्धारित किए गए हैं? solve_udअपने स्टैक ट्रेस में अन्यथा कहता है। हालांकि आपके पास solve_odभी है, और शायद इस मुद्दे से कोई लेना-देना नहीं है। लेकिन यह पता लगाने के लिए चोट नहीं करता कि ऐसा क्यों हो रहा है और इसे ठीक करें यदि आपको लगता है कि सिस्टम ठीक होना चाहिए।

क्या आर्मडिल्लो हल () धागा सुरक्षित है?

मुझे लगता है कि यही कारण है कि अपने LAPACK संस्करण पर निर्भर करता है, यह भी देखना यह । सभी चर के कोड को देखकर solve_odलगता है कि यह स्थानीय है। कोड में चेतावनी पर ध्यान दें:

नोट: ATLAS 3.6 द्वारा आपूर्ति की गई लैपैक लाइब्रेरी में dgels () फ़ंक्शन में समस्याएं हैं

इस प्रकार यह केवल lapack::gelsआपके लिए परेशानी का कारण बन सकता है। यदि लैपैक को ठीक करना संभव नहीं है, तो एक वर्कअराउंड आपके सिस्टम को स्टैक करने और एक बड़ी प्रणाली को हल करने के लिए है। यदि आपकी व्यक्तिगत प्रणालियाँ छोटी हैं तो संभवतः यह और भी अधिक कुशल होगी।


1

अर्माडिलो के solve()फंक्शन की थ्रेड सेफ्टी BLAS लाइब्रेरी पर निर्भर करती है (केवल) जो आप उपयोग करते हैं। जब BLAS होता है तो LAPACK कार्यान्वयन थ्रेड सुरक्षित होता है। संदर्भ BLAS लाइब्रेरी से लिंक करते समय आर्मडिलो solve()फ़ंक्शन थ्रेड सुरक्षित नहीं है । हालांकि, OpenBLAS का उपयोग करते समय यह थ्रेड सुरक्षित है । इसके अतिरिक्त, एटलस एक बीएलएएस कार्यान्वयन प्रदान करता है जिसमें यह भी उल्लेख है कि यह थ्रेड सुरक्षित है , और इंटेल एमकेएल थ्रेड सुरक्षित भी है , लेकिन मुझे उन पुस्तकालयों से जुड़े आर्मडिलो के साथ कोई अनुभव नहीं है।

बेशक, यह केवल तब लागू होता है जब आप solve()विभिन्न डेटा के साथ कई थ्रेड से चलते हैं ।

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