2012-01-11 12 views
10

का कारण बनता है मैं एक बड़ी समस्या को हल कर रहा हूं और कुछ लूपों को समानांतर करने के लिए ओपनएमपी का उपयोग करने का प्रयास करते समय एक बग में चला गया हूं। मैंने समस्या को दो सरल कोड के साथ दोबारा बनाया है जो मेरे अपने कोड की नकल करता है।ओपनएमपी और ईजिन का उपयोग अनंत लूप/डेडलॉक

समस्या यह है कि जब मैं प्रोग्राम चलाता हूं, तो यह यादृच्छिक रूप से कुछ प्रकार के अनंत लूप/डेडलॉक में जाएगा (सीपीयू 100% है, लेकिन कुछ भी नहीं करता है)। जो मैं अपने परीक्षण से बता सकता हूं, उनमें से एक थ्रेड मैट्रिक्स-मैट्रिक्स उत्पाद की गणना करने का प्रयास करता है लेकिन किसी कारण से कभी खत्म नहीं होता है।

मुझे पता है कि यदि आप OpenMP को सक्षम करते हैं, तो Eigen OpenMP का उपयोग करके मैट्रिक्स-मैट्रिक्स उत्पादों को समानांतर करेगा। मैं इसके बाहर एक और समांतर लूप भी जोड़ रहा हूं। हालांकि, यह बग तब भी होता है जब मैं EIGEN_DONT_PARALLELIZE को परिभाषित करके ईजिन के समांतरता को अक्षम करता हूं।

मैं मैकोज़ संस्करण 4.6.0 20101127 का उपयोग मैकोज़ 10.6.8 पर ईजिन 3.0.4 के साथ कर रहा हूं।

मैं समझ नहीं क्या गलत हो रहा हो सकता है ...

#include <iostream> 
#include <Eigen/Core> 

using namespace std; 
using namespace Eigen; 

MatrixXd Test(MatrixXd const& F, MatrixXd const& G) 
{ 
    MatrixXd H(F.rows(), G.cols()); 
    H.noalias() = F*G; 

    return H; 
} 

int main() 
{ 
    MatrixXd F = MatrixXd::Random(2,2); 
    MatrixXd G = MatrixXd::Random(2,2); 

    #pragma omp parallel for 
    for (unsigned int i = 0; i < 10000; ++i) 
    MatrixXd H = Test(F,G); 

    cout << "Done!" << endl; 
} 
+0

क्या 'MatrixXd :: यादृच्छिक' थ्रेड-सुरक्षित है? – Mysticial

+0

मेरे असली कोड में, मैं MatrixXd :: रैंडम को कॉल नहीं कर रहा हूं। संपादित करें: मैंने MatrixXd :: कॉलम को कॉल को हटाने के लिए कोड बदल दिया है और बग अभी भी वहां है। – user1144371

+0

यह कुछ बेवकूफ नहीं है [यह] (http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)? क्योंकि वर्तमान में यह ओपनएमपी त्रुटि की तरह नहीं दिखता है। मैंने जीसीसी संस्करण 4.5.0 20100604 के साथ किसी भी समस्या के बिना समानांतर में अपने प्रोग्राम को डाउनलोड और चलाया। – Bort

उत्तर

10

कुछ डिबगिंग के बाद, मुझे लगता है कि समस्या Eigen में स्थित है।

static std::ptrdiff_t m_l1CacheSize = 0; 
static std::ptrdiff_t m_l2CacheSize = 0; 

को यह बदल रहा है:

static std::ptrdiff_t m_l1CacheSize = 0; 
static std::ptrdiff_t m_l2CacheSize = 0; 
#pragma omp threadprivate(m_l1CacheSize, m_l2CacheSize) 

मेरी समस्या ठीक हो गई फ़ाइल src/Core/products/GeneralBlockPanelKernel.h में एक समारोह manage_caching_sizes कहा जाता है कि दो स्थैतिक चर वाणी है।

+2

मैं सिर्फ देखा है कि इस बग हाल Eigen संस्करणों में तय किया गया था, इस stackoverflow सवाल करने के लिए धन्यवाद, बग रिपोर्ट देखें: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=406 तो अब समाधान होगा अपने Eigen लाइब्रेरी को अपडेट करना। – catchmeifyoutry

2

मुझे एक ही समस्या थी, यहां तक ​​कि ईजिन (3.0.5) के नवीनतम संस्करण के साथ भी। मैंने ऊपर प्रस्तावित फिक्स की कोशिश की और नए शुरुआती लोगों की वजह से संस्करण 3.0.5 के साथ यह संभव नहीं है। तो मैंने निम्नलिखित परिवर्तन किया:

static std::ptrdiff_t m_l1CacheSize; 
static std::ptrdiff_t m_l2CacheSize; 
#pragma omp threadprivate(m_l1CacheSize, m_l2CacheSize) 

if (m_l1CacheSize==0) 
{ 
    m_l1CacheSize = manage_caching_sizes_second_if_negative(queryL1CacheSize(),8 * 1024); 
    m_l2CacheSize = manage_caching_sizes_second_if_negative(queryTopLevelCacheSize(),1*1024*1024); 
} 

मेरी समस्या तय की गई।

2

मुझे माइक्रोसॉफ्ट विजुअल स्टूडियो 2010 एसपी 1 पीपीएल/parallel_for का उपयोग कर एक ही समस्या थी। समाधान

http://eigen.tuxfamily.org/dox/TopicMultiThreading.html

में वर्णन किया गया एक बहु आवेदन

मामले में अपने खुद के आवेदन थ्रेड में Eigen का उपयोग करना, और कई धागे Eigen को कॉल करने, तो आप करने के लिए है धागे बनाने से पहले निम्नलिखित दिनचर्या बुला द्वारा Eigen प्रारंभ:

#include <Eigen/Core> 

int main(int argc, char** argv) 
{ 
    Eigen::initParallel(); 

    ... 
} 

में यदि आपका एप्लिकेशन ओपनएमपी के साथ समानांतर है, तो आप पिछले अनुभाग में विस्तृत के रूप में Eigen के अपने पैरालाइजेशन को अक्षम करना चाहते हैं।

संबंधित मुद्दे