使用OMP_SCHEDULE与#pragma omp并行调度(运行时)

Using OMP_SCHEDULE with #pragma omp for parallel schedule(runtime)

本文关键字:调度 并行 运行时 omp #pragma OMP SCHEDULE 使用      更新时间:2023-10-16

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

我得出结论,我需要将变量OMP_SCHEDULE设置为某个值。然而,我不知道如何做到这一点,我还没有找到任何工作的c++示例来解释我如何正确地做到这一点。

可以有人解释我如何设置变量,并提供一个工作的c++例子吗?

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

我将给你一些静态和动态调度的例子。对于被引导者也是类似的。

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

设置
setenv OMP_SCHEDULE “dynamic,5”
静态调度

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

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

如果我们使用默认的静态调度并在外部for循环中放置pragma,那么每个线程将完成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用于调度。这取决于循环的大小