矩阵乘法(OpenMP)的优化 - C.

时间:2017-11-15 08:33:42

标签: c matrix 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;

还有一点新意,那么是否有任何简单的改动来提高性能或者我已经做过了吗?我是否因为不使用还原而遇到任何数据竞争?

1 个答案:

答案 0 :(得分:2)

您当前的实施可能无法改进很多。此时,它归结为编译器和缓存使用情况。一个有趣的观点是here by Intel GCC需要交换两个循环以便对乘法进行矢量化(即使用SIMD)。对于非常大的矩阵,您可以考虑将矩阵划分为条带而不是块。这会带来复杂性和开销,但可以提高缓存使用率。

只有当您使用多个线程对单个变量求和时才需要使用reduction子句,但由于您只对k求和,所以不是这种情况。

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

#pragma omp parallel for

在我看来看起来有点干净。