Умножение распараллеливающей матрицы OpenMP на тройку для цикл (проблема с производительностью)

Я пишу программу для умножения матриц с помощью OpenMP, которая для удобства кеширования реализует умножение A x B (транспонирование) строк на X строк вместо классического A x B строк x столбцов для повышения эффективности кеширования. При этом я столкнулся с интересным фактом, который для меня нелогичен: если в этом коде я распараллеливаю внешний цикл, программа будет работать медленнее, чем если бы я поместил директивы OpenMP в самый внутренний цикл, на моем компьютере время составляет 10,9 против 8,1 секунды.

//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)
    }
  }
}
7
задан Alf 7 July 2016 в 07:22
поделиться