我想用OpenMP
来达到这个效果:修正线程数量,如果有空闲线程,调度任务到其中,否则等待空闲线程。以下是我的测试代码:是否有可能修复线程数量并在空闲时调度任务?
#include <omp.h>
#include <stdio.h>
#include <unistd.h>
void func(void) {
#pragma omp parallel for
for (int i = 0; i < 3; i++)
{
sleep(30);
printf("%d\n", omp_get_thread_num());
}
}
int main(void) {
omp_set_nested(1);
omp_set_num_threads(omp_get_num_procs());
#pragma omp parallel for
for (int i = 0; i < 8; i++)
{
printf("%d\n", omp_get_thread_num());
func();
}
return 0;
}
其实,我的机器包含24
内核,因此
omp_set_num_threads(omp_get_num_procs())
将在年初推出24
线程。然后main
的for-loop
将占用8
线程,在每个线程中,func
将被调用,因此应该使用附加2
线程。从我的计算来看,我认为24
线程就足够了。但在实际运行中,总共有线程生成了208
。
所以我的问题如下:
(1)为什么如此多的线程创建,虽然24
似乎不够?
(2)是否有可能修复线程数量(例如,与内核数量相同)并在空闲时调度任务?
“这就是'parallel for'被定义为一个并行指令后立即跟着一个'loop'指令的方式,所以不存在基于工作共享粒度的线程创建限制。 。如果可能,你能否详细说明一下?谢谢! –
@南晓我回答了我的问题。 – Zulan