C++中的最大线程数
Maximum number of threads in C++
知识问答
通常,当我想用C++编写多线程程序时,我会询问硬件支持的并发线程数,如下所示:
unsigned int numThreads = std::thread::hardware_concurrency();
这个returns支持的并发总数。因此,如果我们有 2 个 CPU,每个都可以支持 12 个线程,那么 numThreads
将等于 24。
问题
最近我使用 numactl
强制执行一个程序 运行 仅在一个 CPU 上。
numactl -N 1 ./a.out
问题是 std::thread::hardware_concurrency()
returns 24 即使我 运行 它与 numactl -N 1
一样。然而,在这样的设置下 nproc
的输出是 12.
numactl -N 1 nproc --> output = 12
问题
也许std::thread::hardware_concurrency()
并不是为了支持这种情况而设计的。那不是我关心的。我的问题是,当我想 运行 我的程序 numactl
.
时,获得支持的线程数的 最佳实践是什么
更多信息
如果您还没有处理过 numactl
,它可以用于 运行 使用 NUMA 策略的进程。例如,您可以使用它来强制您的程序仅在一个 CPU 上 运行。这种情况的用法如上所示。
您必须使用 OS 特定调用来查询它对您的流程施加的限制。
hardware_concurrency
可能 return 提示(由您的硬件)支持的线程数,或者 return 0。 OS 可以将您的进程限制为比这个数字更少的线程(或者可能使用更多),无论是使用像 numactl
这样的工具,正常调度,还是其他一些方式。某些进程或用户总是有可能更改允许的 CPU 集,这会影响可用的并发性。典型的 C++ 程序不必关心这些细节,特别是因为可用线程数的变化通常是短暂的。
知识问答
通常,当我想用C++编写多线程程序时,我会询问硬件支持的并发线程数,如下所示:
unsigned int numThreads = std::thread::hardware_concurrency();
这个returns支持的并发总数。因此,如果我们有 2 个 CPU,每个都可以支持 12 个线程,那么 numThreads
将等于 24。
问题
最近我使用 numactl
强制执行一个程序 运行 仅在一个 CPU 上。
numactl -N 1 ./a.out
问题是 std::thread::hardware_concurrency()
returns 24 即使我 运行 它与 numactl -N 1
一样。然而,在这样的设置下 nproc
的输出是 12.
numactl -N 1 nproc --> output = 12
问题
也许std::thread::hardware_concurrency()
并不是为了支持这种情况而设计的。那不是我关心的。我的问题是,当我想 运行 我的程序 numactl
.
更多信息
如果您还没有处理过 numactl
,它可以用于 运行 使用 NUMA 策略的进程。例如,您可以使用它来强制您的程序仅在一个 CPU 上 运行。这种情况的用法如上所示。
您必须使用 OS 特定调用来查询它对您的流程施加的限制。
hardware_concurrency
可能 return 提示(由您的硬件)支持的线程数,或者 return 0。 OS 可以将您的进程限制为比这个数字更少的线程(或者可能使用更多),无论是使用像 numactl
这样的工具,正常调度,还是其他一些方式。某些进程或用户总是有可能更改允许的 CPU 集,这会影响可用的并发性。典型的 C++ 程序不必关心这些细节,特别是因为可用线程数的变化通常是短暂的。