Hallo,
ich habe mir mal OpenMP angeschaut und versucht, eine Matrix Multiplikation zu realisieren. Allerdings scheint die Parallelisierung nicht zu klappen, weil die Iterative Variante schneller ist, als OpenMP und eigentlich solle OMP ja schneller sein. Woran kann das liegen? Ich habe die FOR parallelisiert und und mit sheduled(guided) den Indexraum proportional zu der Restarbeit aufgeteilt:
TID: 0 | Anz. der CPU = 4
TID: 0 | Anz. Threads = 4
Und hier mal geplottet:
03_Bild.jpg
Warum das so klein geworden ist liegt wohl am Upload. Eigentlich sind das 1024x768. Naja, x-Achse Größe und y-Achse sind die Sekunden, die er braucht, um die Matrix zu lösen. OpenMP wäre die grüne Linie.
ich habe mir mal OpenMP angeschaut und versucht, eine Matrix Multiplikation zu realisieren. Allerdings scheint die Parallelisierung nicht zu klappen, weil die Iterative Variante schneller ist, als OpenMP und eigentlich solle OMP ja schneller sein. Woran kann das liegen? Ich habe die FOR parallelisiert und und mit sheduled(guided) den Indexraum proportional zu der Restarbeit aufgeteilt:
TID: 0 | Anz. der CPU = 4
TID: 0 | Anz. Threads = 4
Code:
void solveOpenMP_afterFlip(int **A, int **B, int **C, int matrixSize){ //A & B sind die Matrizen, die multipliziert werden, C das Resultat B = flipMatrix(B, matrixSize); #pragma omp parallel shared(A,B,C) num_threads(4) { #pragma omp parallel for collapse(3) schedule(guided) for(int i = 0; i < matrixSize; i++){ for(int j = 0; j < matrixSize; j++){ for(int k = 0; k < matrixSize; k++){ C[i][j] = C[i][j] + A[i][k] * B[j][k]; } } } } }
Und hier mal geplottet:
03_Bild.jpg
Warum das so klein geworden ist liegt wohl am Upload. Eigentlich sind das 1024x768. Naja, x-Achse Größe und y-Achse sind die Sekunden, die er braucht, um die Matrix zu lösen. OpenMP wäre die grüne Linie.
Comment