C 我在matmul函数上使用了openMP指令,但它不起作用

C 我在matmul函数上使用了openMP指令,但它不起作用,c,openmp,openmpi,C,Openmp,Openmpi,我试图在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_

我试图在
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!
int matmul(int l,int m,int n,float*A,float*B,float*C)
{
int i,j,k;
omp_集_动态(0);
#用于共享(A、B、C)私有(i、k、j)num_线程的pragma omp并行(4)
对于(i=0;i
我该怎么办

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!
使用来自的优化matmul,而不是尝试编写自己的matmul

优化矩阵乘法非常重要(您还没有考虑矢量化或平铺,这两者都是获得高性能所必需的)

如果您使用的是英特尔处理器,它现在可以免费供任何人使用,并且经过高度优化,或者还有其他免费的实现

我意识到阅读手册不如编写代码有趣,但在这种情况下,阅读手册也更有效


(如果这对任何人都很重要,我为英特尔工作,但这条建议完全是一般性的:-)

欢迎来到Stack Overflow!您的问题缺少有关预期代码输入/输出的详细信息。您试图实现什么,而什么不起作用?我改进了您问题的格式,并添加了一个结束语
}
添加到您的代码中。但是您的代码仍然是O(n^3),因此无论发生什么情况,运行时都会很高。您所说的“不工作”是什么意思?如果在单个线程上运行代码,需要多少时间;如果在4个线程上运行代码,需要多少时间?您是如何编译它的?当您说不工作时,请尝试
mpirun-bind to none…
,您的意思是什么?如果它在添加线程时进行缩放,那么它就可以工作。是这样吗?此外,您使用的编译器优化级别是什么?我不明白为什么新一代编译器不能为一组简单的乘法和加法运算生成高度优化的代码。@NPE好的,英特尔编译器可以用调用MKL来代替matmul循环。当然没有硬边界——一个足够聪明的人可以产生完美的matmul代码。然而,在实践中,微体系结构的复杂性和编译器的聪明度之间的差距是巨大的。Matmul是一个很好的例子,因为它被广泛使用。你可以为每一个新的架构写一篇新的论文。[这篇短文](www.acsel-lab.com/aluthm/arith24/data/1965a144.pdf)简要介绍了所涉及的技术。这个答案在实践中肯定是正确的——我觉得这是一个错失的机会,无法进一步了解编写正确且合理执行的OpenMP程序。不幸的是,这个问题缺少全面回答所需的关键细节。@NPE您有没有看过Eigen实现的复杂性?这是无关紧要的,它只是标题。此外,eigen可以使用MKL或其他BLAS库?你认为他在做什么?我的观点是,事实上,目前的编译器都不能为简单的矩阵乘法实现生成高度优化的代码。