Ich versuche die verschachtelte for-Schleife in der Funktion generate_histogram () unten mit openMP zu optimieren. Ich habe viel mit verschiedenen Kombinationen von Pragmas probiert, basierend auf dem, was ich in dieser SE-Beitrag .
Das Problem ist, dass die geschachtelte for-Schleife ohne openMP schneller als mit openMP ist!
Wenn ich versuche, meinen Code mit der Reduktion anstelle des atomaren Pragma zu parallelisieren, endet der Fehler bei netchunk. Kennt jemand eine feine zwicken für diese? Ich versuche Daten in ein Histogramm zu zerlegen. Daher ist das Histogramm im realen Code unterschiedlich groß, anders als im folgenden Ausschnitt.
%Vor%Das ist ein interessantes Problem. Ich habe deinen Code repariert. @ KunHuang hatte die richtige Idee, aber Sie haben mehrere Probleme mit privaten und gemeinsamen Variablen.
Deine alte Funktion heißt generate_histogram
, in der ich das omp-Zeug auskommentiert habe. Der neue, der OpenMP verwendet, heißt generate_histogram_omp
.
Der alte Code endet in der Zeit 0,67 Sekunden auf meinem System (Efeu-Bridge Dual Core) und der neue Code endet in 0,32 Sekunden.
Ich habe auch versucht, Ihre Schleife zu verschmelzen, aber das hat die Leistung viel schlechter gemacht (wahrscheinlich ein Cache-Problem), also parallelisiere ich nur die erste Schleife und bekomme trotzdem eine doppelte Geschwindigkeit auf zwei Kernen mit dem aktuellen Code. Ich habe den fusionierten Code auskommentiert, wenn du damit spielen willst.
Schließlich füllen Ihre anfänglichen Werte der Matrix das Histogramm nicht wirklich aus, d. h. es werden nur ein paar Bins gefüllt.
Ich habe mit
kompiliert %Vor%Der Code:
%Vor%Es ist nicht möglich, ein Array oder eine Struktur in OpenMP zu reduzieren, was hier erwähnt wird: Ссылка .
Ich denke, Sie können mehrere Kopien von histogram
deklarieren, von denen jedes in einem Thread verwendet wird. Verwenden Sie danach eine andere OpenMP-Schleife, um sie hinzuzufügen.
Tags und Links c parallel-processing openmp for-loop