私はもっと大きな問題を解決していて、OpenMP を使用していくつかのループを並列化しようとするとバグに遭遇しました。私自身のコードを模倣した以下のいくつかの単純なコードで問題を再現しました。
問題は、プログラムを実行すると、ある種の無限ループ/デッドロックがランダムに発生することです (CPU は 100% ですが、何もしません)。私のテストからわかることから、スレッドの 1 つが行列 - 行列の積を計算しようとしますが、何らかの理由で終了しません。
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;
}