矩阵乘法优化(OpenMP)

我正在学习一些关于openMP的知识,并试图在这里使用它来将两个矩阵相乘。

void matrix_multiply(matrix *A, matrix *B, matrix *C) {

    #pragma omp parallel
    {
        #pragma omp for 
        for(int i = 0; i < A->dim.rows; i++) {
            for(int j = 0; j < B->dim.cols; j++) {
                C->data[i][j] = 0;
                for (int k = 0; k < A->dim.cols; k++) {
                C->data[i][j] += A->data[i][k] * B->data[k][j];
               }
           }
       }
   }
}

typedef struct shape {
    int rows;
    int cols;
} shape;

typedef struct matrix {
    shape dim;
    float** data;
} matrix;

还有一点新的东西,那么是否有任何简单的改变来提高性能,或者我已经这样做了? 还有,我是否因为不使用还原而遇到任何数据竞赛?


你当前的实现可能不会有很大的改进。 在这一点上,它涉及到编译器和缓存的使用。 英特尔在此提出了一个有趣的观点,即GCC需要交换两个循环以矢量化乘法(即使用SIMD)。 对于非常大的矩阵,可以考虑将矩阵分成不是以条带形式分块。 这会引入复杂性和开销,但可以提高缓存使用率。

如果你用多个线程求和单个变量,则只需要reduction子句,但这里不是这种情况,因为你只求和k

最后(但这完全是个人的)请注意,你可以用一个替换这两个指令

#pragma omp parallel for

在我看来这看起来更清洁。

链接地址: http://www.djcxy.com/p/85993.html

上一篇: Optimization for Matrix Multiply (OpenMP)

下一篇: How to multiply a 4x4 matrix with a 1x3 matrix in C?