我有一个非常简单的代码:
for(int i=0; i<size; ++i)
for(int j=i; j<size; ++j)
Function(a[i][j])
假设Function()非常耗时,所以我想用OpenMP并行化代码。如果j也从0开始,那将很容易。但是,j从i开始,就像对称矩阵一样。问题是如何以这种方式并行化代码?我认为必须有人有这种经验并提前感谢。
答案 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
是一个整数,找出可能是合适的值。
我假设你的函数调用没有副作用和迭代依赖,这破坏了我概述的方法。