2

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

我得出结论,我需要将变量设置OMP_SCHEDULE为某个值。但是,我不知道该怎么做,也没有找到任何有效的 C++ 示例来解释我如何正确地这样做。

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

4

1 回答 1

12

OMP 调度有 4 种类型。它们是静态的、动态的、运行时的和引导的。每种调度都有其优点。调度的存在是为了更好地平衡线程之间的负载。

我会给你一些静态和动态调度的例子。引导也是类似的。

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

setenv OMP_SCHEDULE “dynamic,5”

静态调度

当您知道每个线程将在编译时或多或少地执行相同数量的工作时,将使用静态调度。

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

如果我们使用默认的静态调度并将 pragma 放在外部 for 循环中,那么每个线程将完成 25% 的外部循环 ( i ) 工作和等量的内部循环 ( j ) 工作因此,完成的工作总量每个线程都是相同的。因此,我们可以简单地坚持使用默认的静态调度来提供最佳负载平衡。

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 进行调度。这取决于循环大小。

于 2013-03-20T00:05:43.260 回答