Sto risolvendo un problema molto più grande e ho riscontrato un errore quando tento di utilizzare OpenMP per parallelizzare alcuni loop. Ho riprodotto il problema con un codice più semplice di seguito che riproduce il mio codice.L'utilizzo di OpenMP ed Eigen causa loop/deadlock infiniti
Il problema è che quando eseguo il programma, casualmente entrerà in una sorta di loop infinito/deadlock (la CPU è al 100%, ma non fa nulla). Da quello che posso dire dai miei test, uno dei thread tenta di calcolare il prodotto matrix-matrix ma non finisce mai per qualche motivo.
So che se si attiva OpenMP, Eigen eseguirà il parallelismo dei prodotti matrice-matrice utilizzando OpenMP. Sto anche aggiungendo un altro ciclo parallelo al di fuori di questo. Tuttavia, questo errore si verifica ancora se disattivo la parallelizzazione di Eigen definendo EIGEN_DONT_PARALLELIZE.
Sto utilizzando gcc versione 4.6.0 20101127 su MacOS 10.6.8 con Eigen 3.0.4.
io non riesco a capire che cosa potrebbe andare male ...
#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
Nel mio codice reale, non sto chiamando MatrixXd :: Random. Modifica: ho cambiato il codice per rimuovere le chiamate a MatrixXd :: Random e il bug è ancora lì. – user1144371
non è qualcosa di stupido come [questo] (http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)? Perché attualmente questo non sembra un errore di openmp. Ho scaricato ed eseguito il tuo programma in parallelo senza problemi con gcc versione 4.5.0 20100604. – Bort