Rozwiązuję znacznie większy problem i mam do czynienia z błędem, kiedy próbuję użyć OpenMP, aby zrównoleglić niektóre pętle. Odtworzyłem problem za pomocą prostszego kodu poniżej, który naśladuje mój własny kod.Używanie OpenMP i Eigen powoduje nieskończoną pętlę/zakleszczenie.
Problem polega na tym, że po uruchomieniu programu losowo przejdzie do jakiejś nieskończonej pętli/zakleszczenia (procesor jest w 100%, ale nic nie robi). Z tego, co mogę powiedzieć z moich testów, jeden z wątków próbuje obliczyć produkt macierzowo-macierzowy, ale nigdy się nie kończy z jakiegoś powodu.
Wiem, że jeśli włączysz OpenMP, Eigen będzie porównywać produkty macierzy z wykorzystaniem OpenMP. Dodaję też inną równoległą pętlę poza tym. Jednak ten błąd nadal występuje, jeśli wyłączę równoległość Eigena, definiując EIGEN_DONT_PARALLELIZE.
Używam gcc w wersji 4.6.0 20101127 na MacOS 10.6.8 z Eigen 3.0.4.
nie mogę dowiedzieć się, co może być nie tak ...
#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;
}
Czy "MatrixXd :: Random' thread-safe? – Mysticial
W moim prawdziwym kodzie nie wzywam MatrixXd :: Random. Edytuj: Zmieniłem kod, aby usunąć połączenia do MatrixXd :: Random, a błąd nadal tam jest. – user1144371
to nie jest głupie jak [to] (http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)? Ponieważ obecnie nie wygląda to jak błąd openmp. Pobrałem i uruchomiłem program równolegle bez żadnych problemów z gcc w wersji 4.5.0 20100604. – Bort