Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading tbb确定不正确的并发性_Multithreading_Tbb_Dlib_Parallel For - Fatal编程技术网

Multithreading tbb确定不正确的并发性

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平均

我正在使用tbb进行并行化,我遇到了一个恼人的问题

我使用tbb::parallel_,算法在单个线程上运行

如果我打印

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