【发布时间】:2019-10-03 03:26:50
【问题描述】:
我最近发现了thread pools 的概念。据我了解,GCC、ICC 和 MSVC 都使用 OpenMP 的线程池。我很想知道当我更改线程数时会发生什么?例如,假设默认线程数为 8。我创建了一个由 8 个线程组成的团队,然后在后面的部分中我会执行 4 个线程,然后我会回到 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 个线程)呢?
每次更改线程数时是否必须重新创建线程池?如果不是,添加或删除线程是否会导致任何重大开销?
线程池的开销是多少,即每个线程有多少工作量进入池?
【问题讨论】:
-
libgomp在需要更多线程时产生额外的线程,但不会杀死已经产生的线程,而是让它们在停靠屏障中休眠。实际开销可以使用 EPCC 的OpenMP microbenchmarks 来衡量。
标签: multithreading threadpool openmp