Estoy solucionando un problema mucho más grande y me he encontrado con un error cuando trato de usar OpenMP para paralelizar algunos bucles. He reproducido el problema con un código más simple a continuación que imita mi propio código.Usar OpenMP y Eigen causa un bucle infinito/interbloqueo
El problema es que cuando ejecuto el programa, entrará aleatoriamente en un tipo de bucle/interbloqueo infinito (la CPU es 100%, pero no hace nada). Por lo que puedo decir de mis pruebas, uno de los hilos intenta calcular el producto matriz-matriz pero nunca termina por alguna razón.
Sé que si habilita OpenMP, Eigen paralelizará los productos de matriz matricial utilizando OpenMP. También estoy agregando otro bucle paralelo fuera de esto. Sin embargo, esta falla aún ocurre si deshabilito la paralelización de Eigen al definir EIGEN_DONT_PARALLELIZE.
Estoy usando gcc versión 4.6.0 20101127 en MacOS 10.6.8 con Eigen 3.0.4.
No puedo imaginar lo que podría ir mal ...
#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' thread-safe? – Mysticial
En mi código real, no estoy llamando a MatrixXd :: Random. Editar: Cambié el código para eliminar las llamadas a MatrixXd :: Random y el error todavía está allí. – user1144371
no es algo estúpido como [esto] (http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)? Porque actualmente esto no parece un error de openmp. Descargué y ejecuté su programa en paralelo sin ningún problema con la versión 4.5.0 20100604 de gcc. – Bort