2

我有一个非常简单的代码,如下所示:

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

假设 Function() 非常耗时,所以我想用 OpenMP 并行化代码。如果 j 也从 0 开始,那就容易了。然而,j 从 i 开始,就像一个对称矩阵。问题是如何并行化这种风格的代码?我想一定有人有这种经验,在此先感谢。

4

1 回答 1

2

一个简单的并行化,将外部循环包装在并行 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是一个整数,找出合适的值。

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

于 2013-01-24T08:51:40.323 回答