Multithreading tbb确定不正确的并发性
我正在使用tbb进行并行化,我遇到了一个恼人的问题 我使用tbb::parallel_,算法在单个线程上运行 如果我打印Multithreading tbb确定不正确的并发性,multithreading,tbb,dlib,parallel-for,Multithreading,Tbb,Dlib,Parallel For,我正在使用tbb进行并行化,我遇到了一个恼人的问题 我使用tbb::parallel_,算法在单个线程上运行 如果我打印 std::cout << tbb::task_scheduler_init::default_num_threads() << std::endl; tbb会创建适当数量的线程,但并行_for仍会调度单个线程上的所有工作(甚至不在内核之间切换)。所有这些都发生在16+线程机器上 此外,top报告100%cpu使用率(而不是正确的1600%)和16平均
std::cout << tbb::task_scheduler_init::default_num_threads() << std::endl;
tbb会创建适当数量的线程,但并行_for仍会调度单个线程上的所有工作(甚至不在内核之间切换)。所有这些都发生在16+线程机器上
此外,top
报告100%
cpu使用率(而不是正确的1600%
)和16
平均负载。在图像中,您可以看到蓝色内核已饱和,而其余内核有时会空闲运行(快照是我的桌面而不是16+内核服务器,但效果类似)
我使用的是tbb-2018_U5
opensuse 15和dlib
这是一个bug吗?也许,调用线程通过
dlib
绑定到一个内核。考虑这个问题。
更新:根据
dlib
的规定,dlib不会影响关联掩码。我已设法通过强制进程的关联来解决该问题。在Linux
中,您可以编写:
cpu_set_t mask;
int status;
CPU_ZERO(&mask);
const auto NUMCORES = sysconf(_SC_NPROCESSORS_ONLN);
for (int64_t core = 0; core < NUMCORES; core++) CPU_SET(core, &mask);
sched_setaffinity(0, sizeof(cpu_set_t), &mask);
cpu设置屏蔽;
智力状态;
CPU_零(和掩码);
const auto NUMCORES=sysconf(仅限处理器);
对于(int64_t core=0;core
在主函数的开头,线程按预期扩展。您好,我找到了这个线程,但我不知道它是什么意思。我已经从源代码编译了
dlib
,但它(在源代码中)没有对tbb的引用。我应该寻找一些linux API调用吗?看起来dlib
使用OS API更改了进程/线程掩码(TBB没有API来更改相关性)。但是,TBB尊重关联掩码的操作系统设置,并根据掩码绑定自己的线程池。Dlib不发送任何关联或类似的线程掩码。我可以补充到讨论中的是Dlib::parallel_for的行为类似,也就是说,它在一个内核上执行所有块。我已经设法找到了进程的关联掩码是1:taskset-p 15299 pid 15299的当前关联掩码:1您是否可以共享最小复制器,或伪代码您如何使用dlib
和tbb
?
cpu_set_t mask;
int status;
CPU_ZERO(&mask);
const auto NUMCORES = sysconf(_SC_NPROCESSORS_ONLN);
for (int64_t core = 0; core < NUMCORES; core++) CPU_SET(core, &mask);
sched_setaffinity(0, sizeof(cpu_set_t), &mask);