【问题标题】:Using OMP_SCHEDULE with #pragma omp for parallel schedule(runtime)使用带有#pragma omp 的 OMP_SCHEDULE 进行并行调度(运行时)
【发布时间】:2013-03-19 18:54:49
【问题描述】:

我正在尝试了解如何在 C++ 中使用 OpenMP 的 schedule(runtime) 指令。经过一番研究,我发现了OMP_SCHEDULE(1)OMP_SCHEDULE(2)

我得出结论,我需要将变量 OMP_SCHEDULE 设置为某个值。 但是,我不知道该怎么做,也没有找到任何有效的 C++ 示例来解释我如何正确地做到这一点。

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

【问题讨论】:

    标签: c++ openmp schedule


    【解决方案1】:

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

    我会给你一些静态和动态调度的例子。引导也是类似的。

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

    setenv OMP_SCHEDULE “dynamic,5”
    

    静态调度

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

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

    如果我们使用默认的静态调度并将 pragma 放在外部 for 循环中,那么每个线程将执行 25% 的外部循环 (i) 工作和等量的内部循环 (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进行调度。这取决于循环大小。

    【讨论】:

    • 实际上schedule(runtime) 指示OpenMP 使用由run-sched-var 内部控制变量给出的调度类型。设置OMP_SCHEDULE 只是设置run-sched-var 的两种可能方式之一。允许实现提供除staticdynamicguided 之外的特殊调度类型,这些只能使用omp_set_schedule() 启用。
    • 另请注意,static 不是默认调度。默认值由def-sched-var ICV 控制,其值为implementation-specific。与许多当前的 OpenMP 运行时一样,它可能恰好是 static,但不能保证它在未来会保持不变。
    • @veda:我知道什么是动态,我知道什么是静态,我知道什么是引导。我单独使用它们没有问题。但是,我不知道如何通过设置 OMP var 来动态更改它们。你能给我一个 C++ 代码吗?
    • 动态更改它们实际上是什么意思?你的意思是你希望你的代码在运行时自动选择调度?
    • 您可以通过在 for 循环上方添加“#pragma omp parallel for schedule(static)”来指定调度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多