2016-07-13 19 views
0

Ich habe eine spärliche Matrix A der Größe (91716x91716) mit 3096684 von Null verschiedenen Elementen und einem dichten Vektor rhs. Ich bin die Lösung des Systems mit einem ConjugateGradient auf diese Weise:Eigen ConjugateGradient Solver läuft nicht mit Multithreading

initParallel(); 
ConjugateGradient<SparseMatrix<double>, Lower|Upper> solver; 
solver.compute(A); 
const VectorXd response = solver.solve(rhs); 

Ich Kompilieren mit:

g++ -O3 -I./eigen -fopenmp -msse2 -DEIGEN_TEST_SSE=ON -o example example.cpp 

die Hinrichtung, die beide mit Multi-Threading und ohne, nehme etwa gleich (um 1500 ms). Ich benutze Eigen Version 3.2.8.

Gibt es einen Grund, warum das Multi-Threading nicht besser funktioniert? Ich sehe den Multithreading-Effekt in meinem Systemmonitor tatsächlich nicht. Gibt es andere Möglichkeiten, diesen Prozess zu beschleunigen?

Bearbeiten: Ein Aufruf an Eigen :: nbThreads() reagiert 12 Threads.

Antwort

2

Dokument der Version 3.2.8

Derzeit sind die folgenden Algorithmen Verwendung von Multi-Threading machen können: allgemeine Matrix - Matrix Produkte, PartialPivLU

http://eigen.tuxfamily.org/dox/TopicMultiThreading.html


Da das Entwicklungsdokument erwähnt, dass mehr Algorithmen Multi-Threading verwenden, müssen Sie auf Eigen3.3-Beta1 oder Entwicklungszweig zu ändern Verwenden Sie die parallele Version von ConjugateGradient.

+0

Oh, ich glaube, ich wurde deswegen verwirrt: https://eigen.tuxfamily.org/dox-devel/TopicMultiThreading.html – Sara

+0

Welches ist die neueste Version? – Sara

+0

Ihr Dokument ist neuer, aber Sie müssen den Dev-Zweig verwenden – kangshiyin