【问题标题】:How to optimize matrix vector multiplication with openmp?如何使用openmp优化矩阵向量乘法?
【发布时间】:2021-02-06 21:31:39
【问题描述】:

我用 C 语言创建了一个执行矩阵向量乘法的程序。我使用 openMP 指令并行执行计算。有没有办法在编译代码时使用 openMP 进一步优化(= 更少的执行时间)矩阵向量乘法,而无需优化标志?

C 代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <omp.h>
#define SIZE 1000

int main() {
   float A[SIZE][SIZE], b[SIZE], c[SIZE];
   int i, j;
   double tStart, tEnd;

   /* Init */
   for (i=0; i < SIZE; i++)
   {
     for (j=0; j < SIZE; j++)
         /* set A_ij to the minimum of x and y  */
       A[i][j] = fminf(i*1.0/(j+1.0),j*1.0/(i+1.0));
     b[i] = 1.0 * (i+1);
     c[i] = 0.0;
   }

   tStart = omp_get_wtime();

   #pragma omp parallel for private(i,j)
   for (i=0; i < SIZE; i++)
     for (j=0; j < SIZE; j++)
       c[i] = c[i] + A[i][j] * b[j];

   tEnd = omp_get_wtime();
   printf("time taken = %.20f\n", tEnd - tStart);

   return 0;
}

【问题讨论】:

  • 小心标记。在 C 问题上弹出 C++ 标签,你会得到无用的 cmets,比如“你为什么不使用 std::array?”或使用纯 C++ 习语回答
  • 是什么让你相信你在这里有虚假分享?除了 Jim 的最佳答案是使用适当的 BLAS 库而不是尝试自己修补之外,我怀疑您会在此代码中以它的编写方式进行错误共享。实际上,典型的 L1 高速缓存行是 64B 长,并且由于可能的对齐约束,在一个块中使用单个线程管理双倍(128B = 32 个浮点数)消除了任何潜在的错误共享。因此,只要您处于 schedule(static) 模式并且您的工作线程少于 1000/32=31.25 个,您就不会出现虚假共享。

标签: c optimization openmp


【解决方案1】:

不要这样做。找一个好的 BLAS 库(有很多免费的,Google 是你的朋友)。

(做到这一点并非易事,“最好的代码是您不必编写的代码。”)

【讨论】:

  • 我知道 openBLAS 库,但我想了解如何使用 openMP 完成它。因为在我展示的代码中,我认为发生了错误的共享。但我真的不知道如何解决这个问题。
  • 如果你的问题真的是关于虚假分享,那么明确地问这个问题;我正在回答你提出的问题,而且,因为我不是通灵者,所以我能做的就是这些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2021-12-20
  • 2021-07-25
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多