私はOpenMPを使用した行列乗算のプログラムを作成しています。これは、キャッシュの利便性のために、従来のA x B行x列ではなく、乗算A x B(転置)行X行を実装して、キャッシュ効率を向上させます。これを行うと、私にとっては非論理的であるという興味深い事実に直面しました。このコードでexternループを並列化すると、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)
}
}
}