MTM*_*TMD 6 c++ multithreading c++11 numactl
琐事
通常,当我想用 C++ 编写多线程程序时,我会询问硬件支持的并发线程数,如下所示:
unsigned int numThreads = std::thread::hardware_concurrency();
Run Code Online (Sandbox Code Playgroud)
这将返回支持的并发总数。因此,如果我们有 2 个 CPU,每个 CPU 都可以支持 12 个线程,numThreads
则等于 24。
问题
最近我曾经numactl
强制一个程序只在一个 CPU 上运行。
numactl -N 1 ./a.out
Run Code Online (Sandbox Code Playgroud)
问题是std::thread::hardware_concurrency()
即使我使用numactl -N 1
. 但是,在这种设置下,输出nproc
为 12。
numactl -N 1 nproc --> output = 12
Run Code Online (Sandbox Code Playgroud)
题
也许std::thread::hardware_concurrency()
不是为了支持这样的场景而设计的。那不是我关心的。我的问题是,什么是最好的做法来获得线程支持的数字时,我想我的运行与程序numactl
。
更多信息
如果您还没有处理过numactl
,它可以用于运行使用 NUMA 策略的进程。例如,您可以使用它来强制您的程序仅在一个 CPU 上运行。这种情况的用法如上所示。
您必须使用操作系统特定的调用来查询它对您的进程施加的限制。
hardware_concurrency
可能会返回一个提示(由您的硬件支持),或者可能返回 0。操作系统可以将您的进程限制为少于此数量的线程(或可能使用更多),无论是使用诸如 、正常numactl
调度或其他一些手段。某些进程或用户总是有可能更改允许的 CPU 集,这可能会影响可用的并发性。典型的 C++ 程序不需要关心这些细节,特别是因为可用线程数量的变化通常是暂时的。