c++ - 并行内的 set_num_threads 不起作用

标签 c++ multithreading openmp

我正在努力将并行区域内的线程数设置为 1。我设置了一个障碍,以便所有线程都在该点停止,我可以自由地将线程数设置为 1(并且不会有线程执行)。但是无论我把 omp_set_num_threads(1) 放在哪里,它总是返回 3。是否可以在运行时更改线程数?我该怎么做?

#import<iostream>
#import<omp.h>
#import<stdio.h>

int main(){

int num_of_threads;
std::cin>>num_of_threads;
omp_set_dynamic(0); 
#pragma omp parallel if(num_of_threads>1) num_threads(3)
{
    int t_id = omp_get_thread_num();
    int t_total = omp_get_num_threads();
    printf("Current thread id: %d \n Total number_of_threads: %d \n",t_id,t_total);
    #pragma omp barrier
    #pragma omp single
    { 
    omp_set_num_threads(1);
    t_id = omp_get_thread_num();
    t_total = omp_get_num_threads();
    printf("Single section \n Current thread id: %d \n Total number_of_threads: %d \n",t_id,t_total);
    }
}


}

最佳答案

TL;DR 您无法更改并行区域中的线程数。

请记住,这是一个线程池,在并行区域的开头 fork 。在内部,它们甚至不同步(如果您不告诉它们),因此 OpenMP 需要在未知位置终止其中一些 - 显然是个坏主意。

您的#pragma omp single 使以下代码部分由单个线程执行,因此无需通过 omp_set_num_threads 进行设置。 但是它不会改变您的池,它只是建议编译器将以下部分安排到一个线程 - 而其余部分将忽略它。

要显示此行为,例如出于大学目的,我建议仅并行打印线程 ID 和单个部分。这样您就可以判断它是否有效。

关于c++ - 并行内的 set_num_threads 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52492896/

相关文章:

multithreading - 在 Silverlight UI 线程中,执行 InvokeAsync 时会发生什么情况?

c - 使用 SIMD 和 openMP 加速矩阵乘法

c - 如何确定我的操作系统是否是共享内存多处理器平台

c++ - 不能用openmp编译

c++ - 使用目标 Windows 7 编译后缺少 shcore.dll

c++ - 创建简单的 qml 应用程序

c++ - 对 A::funcA(int) 的 undefined reference

javascript - 使用 Google Protocol Buffer 在 C++ 和 JavaScript 端点之间序列化/反序列化数据?

c# - C#LazyCache并发字典垃圾回收

c - 单行 fprintf 命令是线程安全的吗?