【问题标题】:Maximum number of threads in C++C++ 中的最大线程数
【发布时间】:2019-12-09 09:40:37
【问题描述】:

琐事

通常,当我想用​​ 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 上运行。这种情况的用法如上所示。

【问题讨论】:

  • 最常见的是,您的程序将有一个参数(或它读取的 envvar)来指定线程数,如果未设置,则仅使用 std::thread::hardware_concurrency 作为默认值。 -j 很常见。

标签: c++ multithreading c++11 numactl


【解决方案1】:

您必须使用特定于操作系统的调用来查询它对您的进程施加的限制。

hardware_concurrency 可能会返回(由您的硬件)支持的线程数量的提示,或者可能返回 0。操作系统可以将您的进程限制为少于此数量的线程(或可能使用更多),无论是否使用工具比如numactl,正常调度,或者其他方式。某些进程或用户总是有可能更改允许的 CPU 集,这会影响可用的并发性。一个典型的 C++ 程序不需要关心这些细节,特别是因为可用线程数量的变化通常是暂时的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    相关资源
    最近更新 更多