Jest to kod pisałem:Przyspieszenie mnożenia macierzy za pomocą OpenMP i metody blokowej: czy mogę zrobić lepiej?
#include <omp.h>
void matrix_multi(int c[][TSIZE], int a[][TSIZE], int b[][TSIZE])
{
int B=8;
int i, j, k,i1,j1,k1;
#pragma omp parallel for private(i,j,k,i1,j1,k1) schedule(auto) collapse(3)
for (i=0; i<TSIZE; i+=B)
for (j=0; j<TSIZE; j+=B)
for (k=0; k<TSIZE; k+=B)
for (i1=i;i1<i+B;i1++)
for (j1=j;j1<j+B;j1++)
{
int sum=0;
for (k1=k;k1<k+B;k1++)
{
sum+=a[i1][k1]*b[k1][j1];
}
c[i1][j1]+=sum;
}
}
Moje pytanie brzmi: Czy mogę uzyskać lepszą wydajność przy jakiejś dalszej manipulacji na trzech wewnętrznych pętli?
Czy zmierzyłeś się z osiągnięciami? Mnożenie macierzy można porównać z teoretyczną wydajnością szczytową. – Zulan
Nie jestem przekonany, czy ten kod jest poprawny: dyrektywa 'collapse (3)' jest równoległa do 3 indeksów 'i',' j' i 'k'. Oznacza to, że masz zagwarantowane, że żadne identyczne tryplety 'i, j, k' nie będą obsługiwane przez dwa różne wątki. Można jednak bardzo dobrze mieć tę samą parę "i, j" z innym k dla dwóch wątków. A to doprowadzi do stanu wyścigowego do aktualizacji 'c [i1] [j1]' ... – Gilles
[Ten konkretny film z kursu] (http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-172-performance-engineering-of-software-systems-fall-2010/video-wykłady/wykład-1-matrix-multiply-a-case-study /) w całości poświęcony jest poprawie szybkości mnożenia macierzy. – displayName