का कारण बनता है मैं एक बड़ी समस्या को हल कर रहा हूं और कुछ लूपों को समानांतर करने के लिए ओपनएमपी का उपयोग करने का प्रयास करते समय एक बग में चला गया हूं। मैंने समस्या को दो सरल कोड के साथ दोबारा बनाया है जो मेरे अपने कोड की नकल करता है।ओपनएमपी और ईजिन का उपयोग अनंत लूप/डेडलॉक
समस्या यह है कि जब मैं प्रोग्राम चलाता हूं, तो यह यादृच्छिक रूप से कुछ प्रकार के अनंत लूप/डेडलॉक में जाएगा (सीपीयू 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;
}
क्या 'MatrixXd :: यादृच्छिक' थ्रेड-सुरक्षित है? – Mysticial
मेरे असली कोड में, मैं MatrixXd :: रैंडम को कॉल नहीं कर रहा हूं। संपादित करें: मैंने MatrixXd :: कॉलम को कॉल को हटाने के लिए कोड बदल दिया है और बग अभी भी वहां है। – user1144371
यह कुछ बेवकूफ नहीं है [यह] (http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)? क्योंकि वर्तमान में यह ओपनएमपी त्रुटि की तरह नहीं दिखता है। मैंने जीसीसी संस्करण 4.5.0 20100604 के साथ किसी भी समस्या के बिना समानांतर में अपने प्रोग्राम को डाउनलोड और चलाया। – Bort