使用OpenMP和Block方法加速矩阵乘法:我能做得更好吗?

时间:2016-05-18 05:36:22

标签: c parallel-processing openmp matrix-multiplication

这是我写的代码:

#include <omp.h>
void matrix_multi(int c[][TSIZE], int a[][TSIZE], int b[][TSIZE])
{
   int B=8;

  int i, j, k,i1,j1,k1;
#pragma omp parallel for private(i,j,k,i1,j1,k1) schedule(auto) collapse(3)
  for (i=0; i<TSIZE; i+=B)
    for (j=0; j<TSIZE; j+=B)
      for (k=0; k<TSIZE; k+=B)
        for (i1=i;i1<i+B;i1++)
          for (j1=j;j1<j+B;j1++)
            {
              int sum=0;
              for (k1=k;k1<k+B;k1++)
                {
                  sum+=a[i1][k1]*b[k1][j1];
                }
              c[i1][j1]+=sum;
            }

}

我的问题是:我可以通过对三个内循环进行进一步操作来获得更好的性能吗?

2 个答案:

答案 0 :(得分:3)

线性代数是计算机最常用的操作之一。在游戏和图形库中,它是最常见的操作。它已被大量研究和优化,整个研究小组都致力于此。

如果您关心速度,则应使用BLAS库执行矩阵乘法。 BLAS库将优化的一些内容:

  • 通过在块中执行矩阵乘法而不是在整个矩阵上循环来最小化缓存未命中
  • 优化计算机缓存大小的块大小
  • 如果计算机/ CPU具有多个缓存级别,则使用多个优化的块大小级别
  • 使用SIMD指令(如果CPU上可用)

请注意,并行化不在列表中。这是因为在今天的计算机中,内存访问速度比CPU慢。由于上下文切换的开销,您将看到使用openmp的更差性能。

答案 1 :(得分:1)

您似乎远离完全优化。您是否尝试过循环展开,循环反转等?

您可以参考以下链接,逐步优化矩阵乘法。

http://wiki.cs.utexas.edu/rvdg/HowToOptimizeGemm/