在运行时本地启用/禁用 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 运行时调用的调用。
考虑以下程序,它使用基于变量 t
和 f
(分别为真和假)的条件:
#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的主要内容,如果未能解决你的问题,请参考以下文章
启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误