c++ - 在运行时本地启用/禁用 OpenMP

标签 c++ c multithreading openmp

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

最佳答案

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

考虑以下使用基于变量 tf(分别为 true 和 false)的条件的程序:

#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

关于c++ - 在运行时本地启用/禁用 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39116329/

相关文章:

c++ - 用 setw 截断

c - 打印矩阵错误

python - 是否有适用于Python/或C的多格式文档阅读库?

c++ - 一次将代码添加到 iOS/objective-C 项目和 c++ 库?

java - 是什么让线程的执行顺序不可预测?

ios - CLLocationManager 不回调委托(delegate)中的方法

c++ - 在时区之间转换时间的线程安全方法

c++ - 如何检索添加到由其父类(super class)对象组成的集合中的派生对象?

C++ 改变排序方法

c++ - C++:如果我想在数组中输入一系列数字,而不受我需要输入的数字量的限制。我应该怎么做?