0

在此处输入图像描述

我正在使用 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_U5opensuse 15 和dlib

这是一个错误吗?

4

2 回答 2

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);

在 main 函数的开头,线程按预期扩展。

于 2018-07-20T18:02:13.810 回答
0

也许,调用线程被绑定到一个核心dlib。考虑这个答案

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

于 2018-07-20T14:46:35.347 回答