这是我写的代码:
#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;
}
}
我的问题是:在三个内部循环上进行一些进一步的处理,我能否获得更好的性能?
最佳答案
线性代数是计算机执行的最常见的运算之一。在游戏和图形库中,这是最常见的操作。它已经过大量研究和优化,并且整个研究小组都对此进行了专门研究。
如果您关心速度,则应该使用BLAS库执行矩阵乘法。 BLAS库将优化的一些功能:
请注意,并行化不在列表中。这是因为在当今的计算机中,内存访问速度比CPU慢。由于上下文切换的开销,您将在openmp上看到较差的性能。