琐事
通常,当我想用 C++ 编写多线程程序时,我会询问硬件支持的并发线程数,如下所示:
unsigned int numThreads = std::thread::hardware_concurrency();
这将返回支持的并发总数。因此,如果我们有 2 个 CPU,每个 CPU 可以支持 12 个线程,numThreads
则等于 24。
问题
最近我曾经numactl
强制一个程序只在一个 CPU 上运行。
numactl -N 1 ./a.out
问题是std::thread::hardware_concurrency()
即使我使用它运行它也会返回 24 numactl -N 1
。但是,在这样的设置下,输出nproc
为 12。
numactl -N 1 nproc --> output = 12
问题
也许std::thread::hardware_concurrency()
不是为了支持这种情况而设计的。那不是我关心的问题。我的问题是,当我想用numactl
.
更多信息
如果您还没有处理过numactl
,它可以用于使用 NUMA 策略运行进程。例如,您可以使用它来强制您的程序仅在一个 CPU 上运行。这种情况的用法如上所示。