对于同一个python命令的多个启动如何绑定到NUMA机器上的核心,我感到困惑。
我看到OMP_NUM_THREADS
env设置了为numactl
进程启动的线程数。因此,如果我在超线程HT机器上运行numactl --physcpubind=4-7 --membind=0 python -u test.py
和OMP_NUM_THREADS=4
(下面是lscpu输出),它将这个numactl进程限制为4个线程。但是由于机器有HT,所以我不清楚上面提到的4-7
是4物理的还是4逻辑的。
0-23,96-119
中找到哪个numa-0核是物理的,哪些是逻辑的?96-119
是合乎逻辑的,还是相互交织的?4-7
都是物理核,那么在HT上只需要两个物理核,那么其他两个会发生什么呢?(据我有限的理解,我可以在python main.py
shell中使用不同的numactl绑定20次启动命令sh
,OMP_NUM_THREADS仍然适用,即使我没有在任何地方显式地使用MPI,对吗?)
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 46 bits physical, 48 bits virtual
CPU(s): 192
On-line CPU(s) list: 0-191
Thread(s) per core: 2
Core(s) per socket: 48
Socket(s): 2
NUMA node(s): 4
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Platinum 9242 CPU @ 2.30GHz
Stepping: 7
Frequency boost: enabled
CPU MHz: 1000.026
CPU max MHz: 2301,0000
CPU min MHz: 1000,0000
BogoMIPS: 4600.00
L1d cache: 3 MiB
L1i cache: 3 MiB
L2 cache: 96 MiB
L3 cache: 143 MiB
NUMA node0 CPU(s): 0-23,96-119
NUMA node1 CPU(s): 24-47,120-143
NUMA node2 CPU(s): 48-71,144-167
NUMA node3 CPU(s): 72-95,168-191
发布于 2021-05-26 19:36:47
我看到OMP_NUM_THREADS env设置了为numactl进程启动的线程数。
numactl
不启动线程。它控制进程或共享内存的NUMA策略。但是,OpenMP运行时可以根据numactl
设置的环境调整由区域创建的线程数(尽管标准没有定义AFAIK这种行为)。您应该使用环境变量OMP_NUM_THREADS
来设置线程数。您可以使用环境变量OpenMP检查OMP_DISPLAY_ENV
配置。
如何找到0-23,96-119中的哪个numa-节点-0核是物理的,哪些是逻辑的?96-119是合乎逻辑的,还是相互交织的?
这有点复杂。物理in是/proc/cpuinfo
中可用的。随着时间的推移,他们不能保证保持不变。当机器重新启动时,它们可以改变,也不能“直观”(即。遵循如下规则,比如线程/核心之间的相邻关系)。我们应该避免手工对它们进行硬编码。例如,BIOS更新或内核更新可能导致以不同的顺序枚举逻辑核心。
您可以使用伟大的工具hwloc
将定义良好的确定性逻辑ID转换为物理逻辑ID。在这里,您不能完全确定0和96是共享相同核心的两个线程(尽管对于您的处理器来说,这可能是正确的,它看起来就像内核从每个物理核中枚举出一个逻辑核为核0..95,然后96..191用于每个物理核上的另一个逻辑核)。另一种常见的可能性是Linux连续地对每个物理核执行两个逻辑核,使得逻辑核2n和2n+1共享一个物理核。
如果4-7都是物理核,那么在HT上只需要两个物理核,那么其他两个会发生什么呢?
--physcpubind
of numctl
接受物理cpu编号,如/proc/cpuinfo
关于文献资料的“处理器”字段所示。因此,这里的4-7
应该被解释为物理线程ID。两个线程is可以引用相同的物理内核(在启用超线程的Intel处理器上总是如此)。
在将线程绑定到物理内核中,OpenMP库在哪里被调用?
AFAIK,这是与使用的OpenMP运行时相关的实现(例如。( GOMP、IOMP等)OpenMP运行时的初始化通常是在遇到第一个并行部分时懒洋洋地进行。对于绑定,一些运行时手动读取/proc/cpuinfo
,而另一些则使用hwloc
。如果您想要确定性绑定,那么应该使用OMP_PLACES
和OMP_PROC_BIND
环境变量告诉运行时使用自定义用户定义的方法而不是默认的方法绑定线程。
如果您希望安全和可移植,请使用以下配置(使用Bash):
OMP_NUM_THREADS=4
OMP_PROC_BIND=TRUE
OMP_PLACES={$(hwloc-calc --physical-output --sep "},{" --intersect PU core:all.pu:0)}
OpenMP线程将安排在OpenMP位置上。上面的配置配置了OpenMP运行时,以便在4个不同的固定核心上静态地映射4个线程。
https://stackoverflow.com/questions/67693179
复制相似问题