Fla*_*nix 1 c++ schedule openmp
我试图了解如何schedule(runtime)在C++中使用OpenMP 的指令.经过一些研究,我发现OMP_SCHEDULE(1)并且OMP_SCHEDULE(2).
我总结说我需要将varibale OMP_SCHEDULE设置为某个值.但是,我不知道该怎么做,我还没有找到任何可行的C++示例来解释我如何正确地这样做.
有人可以解释一下如何设置变量并提供一个有效的C++示例吗?
有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进行调度.这取决于循环大小.
| 归档时间: |
|
| 查看次数: |
8570 次 |
| 最近记录: |