Parallelisierung mit OpenMP funktioniert nicht
-
Hallo,
ich möchte folgenden Codeabschnitt parallelisieren. Hab auch schon die, nach meinem Verständnis notwendigen, OpenMp-Anweisungen eingebaut. Aber leider funktioniert es so nicht (ist langsamer als ohne omp und das Endergebnis von sum ist auch nicht korrekt.
... #pragma omp parallel shared(matrix, sobelX, sobelY, sum) { #pragma omp for reduction(+: sum) for (int y = 1; y < (SIZE - 1); y++) { for (int x = 1; x < (SIZE - 1); x++) { int *pMatrix; int tmpX = 0; int tmpY = 0; int *pKernelx = sobelX; int *pKernely = sobelY; for (int ky = -1; ky <= 1; ky++) { pMatrix = matrix + (y + ky) * SIZE + x - 1; for (int kx = -1; kx <= 1; kx++) { tmpX += *pMatrix * *pKernelx++; tmpY += *pMatrix++ * *pKernely++; } } sum += sqrt(tmpX * tmpX + tmpY * tmpY); } } } ...Ich hoffe mir kann jemand einen Hinweis geben, wo der Fehler liegt.
Vielen Dank schonmal.
-
Hat denn niemand eine Idee?
-
Was mir auffällt... sum ist shared und gleichzeitig das Argument für reduction. Sowas ist böse! Falls das nicht hilft: Wie hast Du kompiliert und wie hast Du das aufgerufen (gesetzte Umgebungsvariablen etc., falls manuell gesetzt)?
-
Danke für den Hinweis mit sum. Hab es gleich mal ausprobiert, ändert aber leider nichts.
Kompiliert habe ich so:
g++ -O3 -Wall -fopenmp -o maxgrad maxgrad.cIch habe es auch ohne Optimierung probiert, dadurch wirds aber auch nicht besser.
Umgebungsvariablen habe ich keine gesetzt. Ich weiß aber nicht, was Du meinst mit, wie ich es aufgerufen habe.