问题标签 [numactl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5491 浏览

c++ - C++ 中的最大线程数

琐事

通常,当我想用​​ C++ 编写多线程程序时,我会询问硬件支持的并发线程数,如下所示:

这将返回支持的并发总数。因此,如果我们有 2 个 CPU,每个 CPU 可以支持 12 个线程,numThreads则等于 24。

问题

最近我曾经numactl强制一个程序只在一个 CPU 上运行。

问题是std::thread::hardware_concurrency()即使我使用它运行它也会返回 24 numactl -N 1。但是,在这样的设置下,输出nproc为 12。

问题

也许std::thread::hardware_concurrency()不是为了支持这种情况而设计的。那不是我关心的问题。我的问题是,我想用numactl​​ .

更多信息

如果您还没有处理过numactl,它可以用于使用 NUMA 策略运行进程。例如,您可以使用它来强制您的程序仅在一个 CPU 上运行。这种情况的用法如上所示。

0 投票
0 回答
111 浏览

linux - 局部变量是否在不同的 numa 节点上分配?

如果我们有一个应用程序有两个内存分配 malloc 和 numa_alloc(1)(假设我们有两个 numa 节点 0 和 1),malloc 将在节点 0 上使用内存,而 numa_alloc 将在节点 1 上分配。

在这个应用程序中,如果我们有像 int x 或 sem_t tst 这样的局部变量;这些局部变量在哪里分配;在节点 0 或 1 上?

如果它们在节点 1 上分配,有什么方法可以限制所有与应用程序相关的分配需要在节点 0 上完成,而节点 1 仅用于 numa 分配?

0 投票
1 回答
1187 浏览

performance - numactl & perf 如何更改子进程的内存放置策略?

我注意到 numactl对流基准有一些奇怪的影响

更具体地说,“numactl ./stream_c.exe”报告的内存带宽比“./stream_c.exe”低 40%。

我检查了 numactl源代码,如果我不给它任何参数,它应该没有什么特别之处。所以我天真地期望 numactl 在“numactl ./stream_c.exe”中没有性能影响,根据我的实验,这是不正确的。

这是具有高核数处理器的双插槽服务器。

使用 numastat,我可以看到 numactl 命令导致内存分配不平衡:两个 numa 节点将内存分配拆分为 80:20。

没有 numactl,内存以非常平衡的方式分配:46:54。

我还发现这不仅仅是一个 numactl 问题。如果我使用 perf 调用 stream_c.exe,内存分配甚至比使用 numactl 更不平衡。

所以这更像是一个内核问题:numactl 和 perf 如何更改子进程的内存放置策略?谢谢!

0 投票
1 回答
358 浏览

parallel-processing - 当所有 lscpu 显示 4 个 numa 节点时,使用 --membind=1 或 3 了解失败的 numactl

我一直在试图找出numactl命令失败的问题,但看起来我可能并不完全理解这种方式numactlOMP_MP_THREAD工作方式。

我正在尝试使用 运行main.py绑定到 numa-node-1 的 4 个 cpu 的 1 个实例的脚本numactl --physcpubind=24-27 --membind=1 python -u main.py,如图lscpu所示 CPU 24-27 绑定到 numa-node-1。

但我收到以下错误。

如果我使用--membind=3,我会得到同样的错误,但是当我使用--membind=2 时它会运行。

问题:

1.对于 numa-node=0 是物理内核中的每个 0-230-23,96-119还是只有一些 0-23 是物理内核,因为每个内核有 2 个线程?如何知道 0-23,96-119 中哪些是第二个线程?

2.我是否将物理核心正确绑定到节点?为什么会出现上述失败?

3.哪 2 个 numa 节点在 socket-0 上,哪些在 socket-1 上?

输出:

lscpu:

numactl --硬件:

0 投票
1 回答
311 浏览

parallel-processing - 对 OMP_NUM_THREADS 和 numactl NUMA-cores 绑定感到困惑

我对同一 python 命令的多次启动如何绑定到 NUMA Xeon 机器上的内核感到困惑。

我读到OMP_NUM_THREADSenv var 设置了为numactl进程启动的线程数。因此,如果我在超线程 HT 机器上运行numactl --physcpubind=4-7 --membind=0 python -u test.pyOMP_NUM_THREADS=4下面的 lscpu 输出),它会将这个 numactl 进程限制为 4 个线程。但是由于机器有 HT,我不清楚4-7上面是 4 个物理还是 4 个逻辑。

  • 如何找到其中的哪些 numa-node-0 核心0-23,96-119是物理的,哪些是逻辑的?都是96-119合乎逻辑的还是穿插的?

  • 如果4-7都是物理内核,那么在启用 HT 的情况下,将只需要 2 个物理内核,那么另外 2 个会发生什么?

  • 在将线程绑定到物理内核时,OpenMP 库在哪里被调用?

(根据我有限的理解,我可以使用不同的 numactl 绑定python main.pyshshell 中启动命令 20 次,并且 OMP_NUM_THREADS 仍然适用,即使我没有在任何地方明确使用 MPI lib,对吗?)

0 投票
1 回答
235 浏览

db2 - db2prereqcheck 实用程序找不到库文件 libnuma.so.1。在 ubi7/ubi: 最新的 docker 镜像

我在 ubi7/ubi:latest Docker 映像上安装 numactl-libs(或 libnuma.so.1)以运行 db2 安装时遇到问题。

我已经为 db2 构建了一个 Docker 镜像,想测试一下 DB2 安装是否运行成功。但是,我收到以下错误消息:

DB2 数据库“服务器”的要求不匹配。版本:“11.1.4.6”。
当前系统上未满足的先决条件摘要:
DBT3609E db2prereqcheck 实用程序找不到库文件 libnuma.so.1。

该映像具有 ubi7/ubi:latest 作为基础映像,并且还安装了以下库,如下所示:

numactl-libs(或libnuma.so.1?)外,所有库均已成功安装。

注意:手动安装 numactl-libs 没有问题,因此 DB2 安装成功:

yum install -y numactl-libs但是,我希望使用命令或其他等效命令自动完成 numactl-libs 的安装。
不幸的是,尝试使用该命令yum install -y libnuma.so.1yum install -y libnuma.so.*没有更改任何内容,并且显示了相同的错误消息。

你能帮我么?我会很感激

注意:在我的例子中,使用的是 64 位版本。

更新:

  • 不幸的是,即使尝试安装 libnuma-devlibnuma1没有更改任何内容,错误消息仍然相同。
  • 的输出yum provides libnuma.so.1是:

加载的插件:ovl、product-id、search-disabled-repos、
subscription-manager 此系统未向
授权服务器注册。您可以使用订阅管理器进行注册。
未找到匹配项

  • 看来问题是numactl-libs无法安装: 的输出yum install numactl-libs是:

加载的插件:ovl、product-id、search-disabled-repos、subscription-manager。此系统未向授权服务器注册。您可以使用订阅管理器进行注册。没有可用的包 numactl-libs。

0 投票
0 回答
45 浏览

gpu - QEMU“GPU”NUMA节点设置

当我在具有 2 个 CPU 插槽和 4 个 GPU 的裸机主机系统上安装 Nvidia CUDA Toolkit 时,NUMA 设置如下所示:

在哪里:

  • 0 和 8 是 CPU
  • 252,253,254,255 是 GPU

安装 CUDA 后,我们可以检查 cpuset.mems:

现在我的问题是:当我将 2 个 GPU 传递给 KVM 来宾时,使用:

我希望设置是

  • CPU0 NUMA ID 0
  • GPU1 NUMA ID 255
  • GPU2 NUMA ID 254

但似乎他们正在获得随机值:

有时是0,7-8有时0,5-6

KVM/libvirt 中是否有可能修复 GPU 编号,或者至少告诉他们从 255 开始倒退,因为它是裸机完成的?

谢谢!