使用OMP_SCHEDULE与#pragma omp并行调度(运行时)
Using OMP_SCHEDULE with #pragma omp for parallel schedule(runtime)
我试图了解如何在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用于调度。这取决于循环的大小
相关文章:
- 如何在c++中实现处理器调度模拟器
- C++17中的并行执行策略
- 并行用于C++17中数组索引范围内的循环
- 如何在Elixir中调用递归函数并行
- OpenMP:并行更新数组总是需要减少数组吗
- 如何使用OpenMP并行这两个循环
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用OpenMP使这个循环并行
- 遍历并行数组以确定C++中的最大数字
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 并行标准::复制复杂性
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何在 C++17 STL 并行算法中处理调度?
- OpenMP 与有序和关键指令并行
- OpenMP for 循环并行性问题
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 使用OMP_SCHEDULE与#pragma omp并行调度(运行时)
- 调度大量线程,因此只有4个线程并行执行