并行内的set_num_threads无法正常工作

时间:2018-09-25 07:34:12

标签: 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);
    }
}


}

1 个答案:

答案 0 :(得分:0)

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

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

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

显示此行为,例如出于大学目的,我建议仅并行和单部分打印线程ID。这样,您就可以知道它是否正常工作。