我正在解決一個更大的問題,並且在嘗試使用OpenMP並行化一些循環時遇到了一個錯誤。我用一些比較簡單的代碼來模仿我自己的代碼。使用OpenMP和Eigen導致無限循環/死鎖
問題是,當我運行程序時,它會隨機進入某種無限循環/死鎖(CPU是100%,但什麼都不做)。從我的測試中可以看出,其中一個線程嘗試計算矩陣 - 矩陣乘積,但由於某種原因而未能完成。
我知道如果啓用OpenMP,Eigen將使用OpenMP並行化矩陣矩陣產品。除此之外,我還添加了另一個並行循環。但是,如果我通過定義EIGEN_DONT_PARALLELIZE來禁用Eigen的並行化,該錯誤仍然會發生。
我在使用Eigen 3.0.4的MacOS 10.6.8上使用gcc版本4.6.0 20101127。
我想不出有什麼可以去錯了...
#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 :: Random'是線程安全的嗎? – Mysticial 2012-01-12 00:00:23
在我的真實代碼中,我沒有調用MatrixXd :: Random。編輯:我改變了代碼以去除對MatrixXd :: Random的調用,並且該bug仍然存在。 – user1144371 2012-01-12 00:01:18
它不是像[this]這樣的笨蛋(http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)?因爲目前這看起來不像openmp錯誤。我下載並運行你的程序並沒有任何問題與海灣合作委員會版本4.5.0 20100604。 – Bort 2012-01-12 10:13:27