如何使用OpenMP并行化代码(对称矩阵)?

时间:2013-01-24 06:45:53

标签: openmp

我有一个非常简单的代码:

for(int i=0; i<size; ++i)
  for(int j=i; j<size; ++j)
      Function(a[i][j]) 

假设Function()非常耗时,所以我想用OpenMP并行化代码。如果j也从0开始,那将很容易。但是,j从i开始,就像对称矩阵一样。问题是如何以这种方式并行化代码?我认为必须有人有这种经验并提前感谢。

1 个答案:

答案 0 :(得分:2)

一个天真的并行化,将外环包装成并行指令应该可行。插入行

#pragma omp parallel for
在您的第一个for声明之前

。我写Fortran而不是C所以我不保证语法是正确的,但你应该明白。 OpenMP将根据您设置的计划在i之间分发迭代,如果您没有明确设置,则分配默认计划。

问题在于j上的循环具有非常不同的行程计数,第一个(i==0)具有size次迭代,最后一次(i==size-1时因此,采用静态计划的简单实施将导致程序严重失衡。使用动态时间表,例如

#pragma omp parallel for schedule(dynamic, CHUNKSIZE)

CHUNKSIZE是一个整数,找出可能是合适的值。

我假设你的函数调用没有副作用和迭代依赖,这破坏了我概述的方法。