在运行时本地启用/禁用 OpenMP

Posted

技术标签:

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

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

【问题讨论】:

您不应将 OpenMP 与其他形式的线程结合使用,因为它超出了标准的范围,并且无法保证您的程序将在相应 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

【讨论】:

谢谢,我认为这是完美的解决方案。我可以在编译指示中添加一个布尔变量,它指定是否应该并行化运行。

以上是关于在运行时本地启用/禁用 OpenMP的主要内容,如果未能解决你的问题,请参考以下文章

在运行时启用/禁用 SwaggerUI

在运行时启用和禁用 gprof?

OpenMP 运行时看不到我的 GPU 设备

启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误

在 iOS 应用程序运行时启用/禁用 Crashlytics

在运行时禁用/启用 Firebase Crashlytics