gpt4 book ai didi

c - 矩阵乘法优化 (OpenMP) - C

转载 作者:太空宇宙 更新时间:2023-11-04 08:00:09 24 4
gpt4 key购买 nike

我正在学习一些关于 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;

对此还是有点陌生​​,是否有任何简单的更改来提高性能,或者我已经这样做了?另外,我是否因不使用缩减而遇到任何数据竞争?

最佳答案

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

只有当你用多个线程对单个变量求和时才需要 reduction 子句,这里不是这种情况,因为你只对 k 求和。

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

#pragma omp parallel for

在我看来,这看起来更干净一些。

关于c - 矩阵乘法优化 (OpenMP) - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47302694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com