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

Fla*_*nix 1 c++ schedule openmp

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

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

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

ved*_*eda 9

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

我将举例说明静态和动态调度.对于指导也是类似的.

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

setenv OMP_SCHEDULE “dynamic,5”
Run Code Online (Sandbox Code Playgroud)

静态调度

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

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

如果我们使用的外部for循环默认的静态调度和地方编译,则每个线程都做外环(25%)的工作和内环(的eqaul量Ĵ)因此工作,工作的完成总量每个线程都是一样的.因此,我们可以简单地使用默认静态调度来实现最佳负载平衡.

float A[100][100];

for(int i = 0; i < 100; i++)
{
   for(int j = 0; j < 100; j++)
   {
      A[i][j] = 1.0f;
   }
}
Run Code Online (Sandbox Code Playgroud)

动态调度

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

然而,在以下代码中,

float A[100][100];

for(int i = 0; i < 100; i++)
{
   for(int j = 0; j < i; j++)
   {
      A[i][j] = 1.0f;
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 实际上`schedule(runtime)`指示OpenMP使用_run-sched-var_内部控制变量给出的调度类型.设置`OMP_SCHEDULE`只是设置_run-sched-var_的两种可能方法之一.允许实现提供除`static`,`dynamic`和`guided`之外的特殊调度类型,这些只能使用`omp_set_schedule()`来启用. (2认同)
  • 另请注意,`static`不是默认的调度.默认值由_def-sched-var_ ICV控制,其值为_implementation-specific_.与许多当前的OpenMP运行时一样,它可能恰好是"静态",但不能保证它将来会保持不变. (2认同)