tbb确定不正确的并发

时间:2018-07-20 14:03:08

标签: multithreading tbb dlib parallel-for

enter image description here

我正在使用tbb进行并行化,并且遇到了一个令人讨厌的问题。

我使用tbb :: parallel_for并且该算法在单个线程上运行。

如果我打印

std::cout << tbb::task_scheduler_init::default_num_threads() << std::endl;

它报告1

如果我通过以下方式手动覆盖并发性:

 tbb::task_scheduler_init guard(std::thread::hardware_concurrency());

tbb创建适当数量的线程,但是parallel_for 仍将所有工作调度在单个线程上(甚至不切换内核)。所有这一切都发生在16线程以上的计算机上。

此外,top报告100%的CPU使用率(而不是正确的1600% 16的平均负载。在图像上,您可以看到蓝色核心处于饱和状态,而其他核心有时处于空闲状态(快照是我桌面上的快照,而不是16+核心服务器,但效果相似)。

我正在使用tbb-2018_U5 opensuse 15和dlib

这是一个错误吗?

2 个答案:

答案 0 :(得分:0)

也许,调用线程被dlib绑定到一个内核。考虑这个answer

更新:按照#1422dlib不影响亲和力掩码。

答案 1 :(得分:0)

我通过强制流程的亲和力设法解决了该问题。在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);

在主函数的开头,线程按预期缩放。