Ich möchte OpenMP nutzen, um meine Aufgabe parallel zu machen.Falsche Freigabe im OpenMP-Loop-Array-Zugriff
Ich muss die gleiche Menge an alle Elemente eines Arrays subtrahieren und das Ergebnis in einen anderen Vektor schreiben. Beide Arrays werden dynamisch mit malloc
zugewiesen und das erste wird mit Werten aus einer Datei gefüllt. Jedes Element ist vom Typ uint64_t
.
#pragma omp parallel for
for (uint64_t i = 0; i < size; ++i) {
new_vec[i] = vec[i] - shift;
}
Wo shift
ist der feste Wert I von jedem Element vec
entfernen möchten. size
ist die Länge von vec
und new_vec
, die ungefähr 200k ist.
Ich kompiliere den Code mit g++ -fopenmp
auf Arch Linux. Ich bin auf einem Intel Core i7-6700HQ, und ich verwende 8 Threads. Die Laufzeit ist 5 bis 6 mal höher, wenn ich die OpenMP-Version verwende. Ich kann sehen, dass alle Kerne funktionieren, wenn ich die OpenMP-Version ausführe.
Ich denke, dass dies durch ein Problem der falschen Freigabe verursacht werden kann, aber ich kann es nicht finden.
Ihre Speicherbandbreite ist begrenzt, da die Berechnung, die Sie versuchen, parallel zu machen, trivial ist und im Grunde nur Daten zwischen Speicherorten bewegt. Das Hinzufügen von Threads führt zu Cache-Miss/Thrash- und Pre-Fetch-Fehlern. Der Effekt davon ist, dass der Code langsamer läuft. Sehr ca. 1,5 Threads können den Speicherbus auf einem modernen PC sättigen. –
@RichardCritten das ist nicht wahr. High-End-Prozessoren haben obere Bandbreitenbeschränkungen, die so ausgelegt sind, dass Sie Multithreading verwenden müssen, um sie zu sättigen. Schau dir den Link auf meiner Antwort an. –
Wie messen Sie die Ausführungszeit? –