numpy OpenBLAS legt die maximale Anzahl von Threads fest

8

Ich benutze numpy und mein Modell beinhaltet intensive Matrix-Matrix-Multiplikation. Um zu beschleunigen, verwende ich OpenBLAS Multi-threaded Bibliothek, um die Funktion numpy.dot zu parallelisieren.

Meine Einstellung ist wie folgt,

  • OS: CentOS 6.2 Server #CPUs = 12, #MEM = 96GB
  • Python-Version: Python 2.7.6
  • numpy: numpy 1.8.0
  • OpenBLAS + IntelMKL

$ OMP_NUM_THREADS=8 python test_mul.py

code, von dem ich Ссылка

genommen habe

test_mul.py :

%Vor%

Wenn ich OMP_NUM_THREADS = 1 python test_mul.py verwende, ist das Ergebnis

%Vor%

OMP_NUM_THREADS = 2

%Vor%

OMP_NUM_THREADS = 4

%Vor%

Dinge gehen gut.

Wenn ich jedoch OMP_NUM_THREADS=8 .... einstelle, beginnt der Code "gelegentlich zu arbeiten".

manchmal funktioniert es, manchmal läuft es nicht einmal und gibt mir Core-Dumps.

wenn OMP_NUM_THREADS > 10 . Der Code scheint die ganze Zeit zu brechen. Ich frage mich, was hier passiert? Gibt es so etwas wie eine MAXIMUM Anzahl von Threads, die jeder Prozess verwenden kann? Kann ich dieses Limit erhöhen, wenn ich 12 CPUs in meiner Maschine habe?

Danke

    
Jing 15.03.2014, 01:59
quelle

1 Antwort

6

Erstens verstehe ich nicht wirklich, was Sie mit "OpenBLAS + IntelMKL" meinen. Beides sind BLAS-Bibliotheken, und numpy sollte zur Laufzeit nur mit einem von ihnen verbunden sein. Sie sollten wahrscheinlich überprüfen, welche dieser beiden Nummern tatsächlich verwendet wird. Sie können dies tun, indem Sie Folgendes aufrufen:

%Vor%

Aktualisierung: numpy/core/_dotblas.so wurde in numpy v1.10 entfernt , aber Sie können stattdessen die Verknüpfung von numpy/core/multiarray.so überprüfen.

Zum Beispiel verbinde ich mich mit OpenBLAS:

%Vor%

Wenn Sie tatsächlich mit OpenBLAS verlinken, haben Sie es aus der Quelle erstellt? Wenn Sie das getan haben, sollten Sie sehen, dass es in Makefile.rule eine kommentierte Option gibt:

%Vor%

Standardmäßig versucht OpenBLAS, die maximale Anzahl von Threads automatisch zu verwenden, aber Sie könnten versuchen, diese Zeile selbst auszukommentieren und zu bearbeiten, wenn sie dies nicht richtig erkennt.

Bedenken Sie auch, dass Sie bei der Verwendung von mehr Threads wahrscheinlich geringere Leistungen erzielen werden. Wenn Ihre Arrays nicht sehr groß sind, ist es unwahrscheinlich, dass die Verwendung von mehr als 6 Threads aufgrund des erhöhten Aufwands für die Erstellung und Verwaltung von Threads einen großen Leistungsschub bringt.

    
ali_m 10.05.2014 20:00
quelle