performance - OpenMP 通过三重 for 循环并行化矩阵乘法(性能问题)

标签 performance loops parallel-processing openmp matrix-multiplication

我正在使用 OpenMP 编写矩阵乘法程序,为了缓存方便,实现乘法 A x B(transpose) 行 X 行而不是经典的 A x B 行 x 列,以提高缓存效率。这样做我遇到了一个有趣的事实,对我来说是不合逻辑的:如果在这段代码中我并行化外部循环,则程序比将 OpenMP 指令放在最内循环中的程序慢,在我的计算机中,时间是 10.9 秒和 8.1 秒。

//A and B are double* allocated with malloc, Nu is the lenght of the matrixes 
//which are square

//#pragma omp parallel for
for (i=0; i<Nu; i++){
  for (j=0; j<Nu; j++){
    *(C+(i*Nu+j)) = 0.;
#pragma omp parallel for
    for(k=0;k<Nu ;k++){
      *(C+(i*Nu+j))+=*(A+(i*Nu+k)) * *(B+(j*Nu+k));//C(i,j)=sum(over k) A(i,k)*B(k,j)
    }
  }
}

最佳答案

尝试不那么频繁地达到结果。这会导致缓存行共享并阻止操作并行运行。改用局部变量将允许大多数写入发生在每个内核的 L1 缓存中。

此外,使用 restrict可能有帮助。否则编译器不能保证写入 C没有变化 AB .

尝试:

for (i=0; i<Nu; i++){
  const double* const Arow = A + i*Nu;
  double* const Crow = C + i*Nu;
#pragma omp parallel for
  for (j=0; j<Nu; j++){
    const double* const Bcol = B + j*Nu;
    double sum = 0.0;
    for(k=0;k<Nu ;k++){
      sum += Arow[k] * Bcol[k]; //C(i,j)=sum(over k) A(i,k)*B(k,j)
    }
    Crow[j] = sum;
  }
}

此外,我认为 Elalfer 是正确的,如果您并行化最内层循环,则需要减少。

关于performance - OpenMP 通过三重 for 循环并行化矩阵乘法(性能问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4726712/

相关文章:

java - 给定字符串的可能回文检查 - 需要高效代码

java - 检查连接速度的库

parallel-processing - pytorch : W ParallelNative. cpp:206

python-3.x - 如何在 Python 3 中导入线程包?

bash - 等待 Bash 中除一个进程之外的所有进程

mysql - 如何修复缓慢的 MySQL CURDATE Group by Query

c# - 使用 .Contains 在 asp.net MVc web 应用程序中进行搜索和自动完成搜索的可扩展性如何

arrays - 从迭代器内的对象中删除元素的最佳方法是什么?

c - 如何从数组列表的中间删除一个字符?

javascript - 为什么我的 while 循环没有完全迭代?