将OMP_SCHEDULE与#pragma omp一起用于并行调度(运行时)

时间:2013-03-19 18:54:50

标签: c++ openmp schedule

我试图了解如何在C ++中使用OpenMP的schedule(runtime)指令。经过一些研究,我发现了OMP_SCHEDULE(1)OMP_SCHEDULE(2)

我总结说我需要将varibale OMP_SCHEDULE设置为某个值。 但是,我不知道该怎么做,我还没有找到任何可用的C ++示例来解释我如何正确地这样做。

有人可以解释一下如何设置变量并提供一个有效的C ++示例吗?

1 个答案:

答案 0 :(得分:9)

有4种类型的OMP调度。它们是静态的,动态的,运行时的和引导的。每个调度都有其优点。存在调度以便在线程之间实现更好的负载平衡。

我将举例说明静态和动态调度。它也与导游类似。

schedule(runtime)子句告诉它使用环境变量设置计划。环境变量可以设置为任何其他调度类型。它可以通过

设置
setenv OMP_SCHEDULE “dynamic,5”

静态调度

当您知道每个线程在编译时或多或少会完成相同数量的工作时,就会使用静态调度。

例如,可以使用OMP并行化以下代码。假设我们只使用4个线程。

如果我们使用默认的静态调度并在外部for循环上放置pragma,那么每个线程将执行外部循环的25%( i )工作和内部循环的eqaul量(< em> j )work因此,每个线程完成的工作总量是相同的。因此,我们可以简单地使用默认静态调度来实现最佳负载平衡。

float A[100][100];

for(int i = 0; i < 100; i++)
{
   for(int j = 0; j < 100; j++)
   {
      A[i][j] = 1.0f;
   }
}

动态排程

当您知道每个线程使用静态调度不会执行相同数量的工作时,将使用动态调度。

然而,在以下代码中,

float A[100][100];

for(int i = 0; i < 100; i++)
{
   for(int j = 0; j < i; j++)
   {
      A[i][j] = 1.0f;
   }
}

内循环变量 j 取决于 i 。如果使用默认静态调度,外部循环( i )工作可能在4个线程之间平均分配,但内部循环( j )工作量很大一些线程。这意味着每个线程不会对静态调度执行相同的工作量。静态调度不会导致线程之间的最佳负载平衡。因此,我们切换到动态调度(调度在运行时完成)。这样,您可以确保代码实现最佳负载平衡。

注意:您还可以指定chunk_size进行调度。这取决于循环大小。