Использование OpenMP и Eigen вызывает бесконечный цикл/deadlock

Я решаю гораздо большую задачу и столкнулся с ошибкой при попытке использовать OpenMP для распараллеливания некоторых циклов. Ниже я воспроизвел проблему с помощью более простого кода, который имитирует мой собственный код.

Проблема в том, что когда я запускаю программу, она случайным образом переходит в какой-то бесконечный цикл/deadlock (процессор загружен на 100%, но ничего не делает). Насколько я могу судить по результатам тестирования, один из потоков пытается вычислить произведение матрицы на матрицу, но по какой-то причине не завершается.

Я знаю, что если вы включите OpenMP, Eigen будет распараллеливать матрично-матричные произведения с помощью OpenMP. Я также добавляю еще один параллельный цикл за пределами этого. Однако эта ошибка все еще возникает, если я отключаю распараллеливание Eigen, определяя 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;
}
10
задан user1144371 11 January 2012 в 23:58
поделиться