Piszę program do mnożenia macierzy z OpenMP, który dla wygody cache implementuje mnożenie A x B (transpozycja) wiersze X wiersze zamiast klasycznego A x B wiersze x kolumny, dla lepszej wydajności pamięci podręcznej. Robiąc to spotkałem się z interesującym faktem, który dla mnie jest nielogiczny: jeśli w tym kodzie zrównaję się z zewnętrzną pętlą program jest wolniejszy, niż gdybym umieścił dyrektywy OpenMP w najbardziej wewnętrznej pętli, w moim komputerze czasy wynoszą 10,9 vs 8,1 sekundy.Mnożenie macierzy OpenMP równolegle przez potrójną pętlę (problem wydajności)
//A and B are double* allocated with malloc, Nu is the lenght of the matrixes
//which are square
//#pragma omp parallel for
for (i=0; i<Nu; i++){
for (j=0; j<Nu; j++){
*(C+(i*Nu+j)) = 0.;
#pragma omp parallel for
for(k=0;k<Nu ;k++){
*(C+(i*Nu+j))+=*(A+(i*Nu+k)) * *(B+(j*Nu+k));//C(i,j)=sum(over k) A(i,k)*B(k,j)
}
}
}
Poprawiając parametry omp, mam 200% przyspieszenie na moim komputerze. oryginał: http://llcomp.googlecode.com/hg/examples/mxm.c current: http://codepad.org/nSfZHp03 – jfs
Ładne rozwiązanie.Tak, OpenMP jest trochę podstępny – Elalfer
Kod, który wykorzystuje układ pamięci 'fortran'' dla macierzy 'B' działa o 4-8 szybciej (największe zalety) dla macierzy 1000x1000 (wersja wątkowa zajmuje' 0,5' sekund). https://gist.github.com/790865 – jfs