我有一个非常简单的代码,如下所示:
for(int i=0; i<size; ++i)
for(int j=i; j<size; ++j)
Function(a[i][j])
假设 Function() 非常耗时,所以我想用 OpenMP 并行化代码。如果 j 也从 0 开始,那就容易了。然而,j 从 i 开始,就像一个对称矩阵。问题是如何并行化这种风格的代码?我想一定有人有这种经验,在此先感谢。
我有一个非常简单的代码,如下所示:
for(int i=0; i<size; ++i)
for(int j=i; j<size; ++j)
Function(a[i][j])
假设 Function() 非常耗时,所以我想用 OpenMP 并行化代码。如果 j 也从 0 开始,那就容易了。然而,j 从 i 开始,就像一个对称矩阵。问题是如何并行化这种风格的代码?我想一定有人有这种经验,在此先感谢。
一个简单的并行化,将外部循环包装在并行 for 指令中应该可以工作。插入行
#pragma omp parallel for
在你的第一个for
陈述之前。我写的是 Fortran 而不是 C,所以我不能保证语法是正确的,但你应该明白。OpenMP 将i
根据您设置的计划或默认计划(如果您没有明确设置)分配迭代。
这样做的问题是循环j
有非常不同的行程计数,第一个(when i==0
)有size
迭代,最后一个(when i==size-1
)有 0。因此,具有静态调度的天真实现将导致程序严重不平衡。使用动态时间表,像这样
#pragma omp parallel for schedule(dynamic, CHUNKSIZE)
CHUNKSIZE
是一个整数,找出合适的值。
我假设您的函数调用没有破坏我概述的方法的副作用和迭代依赖性。