我正在尝试在matmul
函数中使用openMP,但是它不起作用...
在这一部分中,我尝试了所有操作,但完成过程需要60分钟以上,而且不会减少任何时间。
我该怎么办?
int matmul( int l, int m, int n, float *A, float *B, float *C )
{
int i, j, k;
omp_set_dynamic(0);
#pragma omp parallel for shared(A,B,C) private(i, k, j) num_threads(4)
for( i=0; i<l; i++ ) // Loop over the rows of A and C.
for( k=0; k<n; k++ ) // Loop over the columns of B and C
{
// Initialize the output element for the inner
// product of row i of A with column j of B
C[i*n+k] = 0;
for( j=0; j<m; j++ ) // Loop over the columns of A and C
{
C[i*n+k] += A[i*m+j] * B[j*n+k]; // Compute the inner product
}
}
}
} // Added by edit!
有人可以帮我吗?
答案 0 :(得分:2)
我该怎么办?
使用BLAS library中的优化matmul,而不要尝试自己编写。
优化矩阵乘法并非易事(您尚未考虑矢量化或平铺,并且都需要两者才能获得高性能)。
如果您使用的是Intel处理器,Intel Math Kernel Library现在对任何人都免费提供,并且经过高度优化,或者免费提供其他实施方式。
我意识到,阅读手册要比编写代码有趣,但在这种情况下,它更有效!
(如果对任何人都重要,我会在Intel工作,但此建议完全是笼统的:-))