OpenMPを使用していくつかのループを並列化しようとすると、より大きな問題を解決してバグに遭遇しました。私は自分のコードを模倣した以下の簡単なコードで問題を再現しました。OpenMPとEigenを使用すると無限ループ/デッドロックが発生する
問題は、私がプログラムを実行すると、無作為にループ/デッドロック(CPUは100%ですが、何もしません)にランダムに入ります。私のテストからわかるように、スレッドの1つは行列 - 行列積を計算しようとしますが、何らかの理由で終了することはありません。
OpenMPを有効にすると、EigenはOpenMPを使用してマトリックスマトリックス製品を並列化します。また、これ以外の並列ループも追加しています。しかし、EIGEN_DONT_PARALLELIZEを定義してEigenの並列化を無効にすると、このバグがまだ発生します。
MacOS 10.6.8でgig version 4.6.0 20101127をEigen 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 :: Random'はスレッドセーフですか? – Mysticial
私の実際のコードでは、MatrixXd :: Randomを呼び出していません。編集:MatrixXd :: Randomへの呼び出しを削除するようにコードを変更しましたが、バグはまだそこにあります。 – user1144371
[this](http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)のような愚かではありませんか?現在、これはopenmpエラーのようには見えないためです。 gccのバージョン4.5.0 20100604で問題なく、あなたのプログラムを並行してダウンロードして実行しました。 – Bort