使用OpenMP的线程池:开销和更改线程数

Z b*_*son 6 multithreading openmp threadpool

我最近发现了线程池的概念.据我所知,GCC,ICC和MSVC都使用OpenMP的线程池.我很想知道当我改变线程数时会发生什么?例如,假设默认线程数为8.我创建了一个由八个线程组成的团队,然后在后面的部分中,我做了四个线程,然后我又回到八个线程.

#pragma omp parallel for
for(int i=0; i<n; i++)

#pragma omp parallel for num_threads(4)
for(int i=0; i<n; i++)

#pragma omp parallel for 
for(int i=0; i<n; i++)
Run Code Online (Sandbox Code Playgroud)

这是我现在实际做的事情,因为我的部分代码使用超线程会导致更糟糕的结果,所以我将线程数减少到物理内核的数量(仅针对该部分代码).如果我做了相反的操作(4个线程,然后是8个,然后是4个),该怎么办?

每次更改线程数时是否必须重新创建线程池?如果没有,添加或删除线程是否会导致任何重大开销?

线程池的开销是多少,即每个线程的哪些部分工作进入池?

Mil*_*lad 7

现在回答这个问题可能已经很晚了.但是,我打算这样做.

当您从头开始使用8个线程时,将创建总共7个线程,然后,包括您的主进程,您有一个8的团队.因此,您的示例代码中的第一个循环将使用此团队执行.因此,线程池有8个线程.完成这个区域后,他们会进入睡眠状态直到被唤醒.

现在,当您到达具有4个线程的第二个并行区域时,您的线程池中只有3个线程被唤醒(3个线程+您当前的主线程),其余线程仍处于睡眠模式.所以,其中四个线程正在睡觉.

然后,类似于第一个并行区域,所有线程将相互合并以执行第三个并行区域.


另一方面,如果你从4个线程开始而第二个并行区域要求8个线程,那么库将理解这个问题并更改并创建4个额外的线程以满足您的要求.通常创建的线程在程序生命周期结束之前不会被抛出池.希望您将来可能需要它.


希望这有助于您和未来的通勤者在这里.