我试图了解如何在C ++中使用OpenMP的schedule(runtime)
指令。经过一些研究,我发现了OMP_SCHEDULE(1)
和OMP_SCHEDULE(2)
。
我总结说我需要将varibale OMP_SCHEDULE
设置为某个值。
但是,我不知道该怎么做,我还没有找到任何可用的C ++示例来解释我如何正确地这样做。
有人可以解释一下如何设置变量并提供一个有效的C ++示例吗?
答案 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进行调度。这取决于循环大小。