我正在努力在并行区域内将线程数设置为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);
}
}
}
答案 0 :(得分:0)
TL; DR您不能更改并行区域中的线程数。
请记住,这是一个线程池,在并行区域的开头分叉。在内部它们甚至都没有同步(如果您也没有告诉他们),因此OpenMP将需要在未知位置终止其中的一些-显然是个坏主意。
您的#pragma omp single使以下代码节由单个线程执行,因此无需通过omp_set_num_threads进行设置。 但是它不会改变您的缓冲池,它只是建议编译器将以下部分安排到一个线程中,而其余部分则将其忽略。
显示此行为,例如出于大学目的,我建议仅并行和单部分打印线程ID。这样,您就可以知道它是否正常工作。