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

时间:2014-05-02 08:57:56

标签: multithreading threadpool openmp

我最近发现了thread pools的概念。据我所知,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++)

这是我现在实际做的事情,因为我的部分代码会因超线程而变得更糟,所以我将线程数减少到物理内核数(仅适用于代码的那部分)。如果我做了相反的操作(4个线程,然后是8个,然后是4个),该怎么办?

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

希望这可以帮助你和未来的上班族。