我正在使用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
这是一个错误吗?
答案 0 :(得分:0)
答案 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);
在主函数的开头,线程按预期缩放。