2017-07-07 1 views
0

Ich möchte cblas_drot an irgendeinem Punkt meines Codes aufrufen, der nicht in einer parallelen Region ist. Dann verwirrt mich, dass die Ausführungszeit für diesen Anruf im Single-Thread-Modus und 24-Thread im Grunde die gleiche ist. Ich habe die Anzahl der Threads nach mkl_set_num_threads() vor dem Funktionsaufruf gesetzt. Hat jemand eine Vorstellung davon, was passiert sein könnte? Danke vielmals.MKL: konnte den Effekt des Threading nicht beobachten

Die CPU ist 2 * Xeon E5 2620v3 und OS ist Unbuntu 16.04.2.

+0

Die BLAS- und LAPACK-Bibliotheken, die mit Linux-Distributionen geliefert werden, sind single-threaded. Proprietäre Leistungsbibliotheks-Builds wie Intel MKL und AMD verfügen möglicherweise über integrierte OpenMP-Threads mit geeigneten Funktionen, jedoch nicht über alle Funktionen in der Bibliothek. Der Standardwert von mkl_set_num_threads ist die Anzahl der physischen Kerne. – tim18

+0

MKL? Rot-Funktionen werden als Threads aufgelistet, aber es ist unwahrscheinlich, dass sie auf 24 Threads skaliert werden, auch wenn Sie 24 physische Cores und eine für die Skalierung optimale Problemgröße haben. ark.intel.com gibt an, dass Sie 6 Kerne pro CPU haben würden, so scheint es, dass die Einstellung von mehr als 12 Threads kontraproduktiv wäre. – tim18

Antwort

0

Wahrscheinlich sättigen Sie die Speicherbandbreite. Die Rechenintensität dieser Funktion ist sehr niedrig, und die Leistungen werden hauptsächlich durch die Zeiten von Speicherzugriffen bestimmt. Tatsächlich hängen die Skalierbarkeitsergebnisse stark von den Inkrementen incX und incY ab. Unter der Annahme, N = 10000000, fand ich, dass (CPU E5-2670):

N threads | time for incX=incY=1 | time for incX=incY=32 
1   | 0.026271    | 1.243775 
2   | 0.020599    | 0.555945 
4   | 0.017871    | 0.301370 
8   | 0.021367    | 0.152756 
16  | 0.021729    | 0.175500 

, das zeigt, dass die Geschwindigkeit-up anständig bis 8 Fäden (und noch immer dort bei 16 Fäden), wenn INCX/Y verschieden ist von 1. Wenn incX/Y = 1 ist, verwendet eine sehr gut optimierte Version der Funktion (mit signifikanter Verwendung von AVX-Funktionen) den größten Teil der verfügbaren Speicherbandbreite, was die Ergebnisse der OpenMP-Parallelisierung sehr schlecht macht. Ich rate nur, was passiert: Um das zu bestätigen, könnten Sie die Verwendung eines Low-Level-Profilers in Erwägung ziehen.

+0

Es scheint, dass ich die Bedeutung von incX und incY, die ich in meinem Programm auf 0 gesetzt habe, falsch verstanden habe und tatsächlich, wenn incX/Y = 1, wird die Leistung als wünschenswert angesehen. Aber ich frage mich immer noch, was die genaue Bedeutung von incX/Y ist? Sieht so aus, als ob es etwas mit dem Füllen der Vektorregister zu tun hat, aber ich finde keine Hinweise in den verfügbaren Materialien. –

+0

incX/Y sind die Schritte zwischen aufeinander folgenden Elementen von Arrays, die entsprechend dem Operator (Rotation in diesem Fall) geändert werden müssen. Normalerweise incX/Y = 1, aber größere Werte können nützlich sein, wenn Sie z. B. an Spalten von Matrizen arbeiten wollen, die Matrizen darstellen. Überprüfen Sie die grundlegende Netlib-Implementierung, um Folgendes zu klären: http://www.netlib.org/lapack/explore-3.1.1-html/drot.f.html – Franz

Verwandte Themen