【问题标题】:Enable/disable OpenMP locally at runtime在运行时本地启用/禁用 OpenMP
【发布时间】:2016-08-24 06:53:24
【问题描述】:

是否可以在运行时启用或禁用 OpenMP 并行化?我有一些代码应该在某些情况下并行运行,而不是在不同情况下并行运行。同时,其他线程中还有其他计算也使用 OpenMP,并且应该始终并行运行。有没有办法告诉 OpenMP 不要在当前线程中并行化?我知道omp_set_num_threads,但我假设它全局设置了 OpenMP 使用的线程数。

【问题讨论】:

  • 您不应将 OpenMP 与其他形式的线程结合使用,因为它超出了标准的范围,并且无法保证您的程序将在相应 OpenMP 运行时的未来版本中正常工作。

标签: c++ c multithreading openmp


【解决方案1】:

您可以使用的替代方法是将if 条件添加到#pragma omp 构造。当条件为假时,这些将跳过对从编译指示派生的 OpenMP 运行时调用的调用。

考虑以下程序,它使用基于变量 tf(分别为真和假)的条件:

#include <omp.h>
#include <stdio.h>

int main (void)
{
    int t = (0 == 0); // true value
    int f = (1 == 0); // false value

    #pragma omp parallel if (f)
    { printf ("FALSE: I am thread %d\n", omp_get_thread_num()); }

    #pragma omp parallel if (t)
    { printf ("TRUE : I am thread %d\n", omp_get_thread_num()); }

    return 0;
}

它的输出是:

$ OMP_NUM_THREADS=4 ./test
FALSE: I am thread 0
TRUE : I am thread 0
TRUE : I am thread 1
TRUE : I am thread 3
TRUE : I am thread 2

【讨论】:

  • 谢谢,我认为这是完美的解决方案。我可以在编译指示中添加一个布尔变量,它指定是否应该并行化运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多