Я решаю гораздо большую проблему и столкнулся с ошибкой при попытке использовать OpenMP для распараллеливания некоторых циклов. Я воспроизвел проблему с помощью более простого кода ниже, который имитирует мой собственный код.
Проблема в том, что когда я запускаю программу, она случайно попадает в какой-то бесконечный цикл / тупик (процессор на 100%, но ничего не делает). Из того, что я могу сказать из моего тестирования, один из потоков пытается вычислить матрично-матричный продукт, но по какой-то причине никогда не завершает работу.
Я знаю, что если вы включите OpenMP, Eigen будет распараллеливать матрично-матричные продукты, используя OpenMP. Я также добавляю еще один параллельный цикл вне этого. Однако эта ошибка все еще возникает, если я отключаю распараллеливание Эйгена, определяя EIGEN_DONT_PARALLELIZE.
Я использую gcc версии 4.6.0 20101127 на MacOS 10.6.8 с 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;
}