Parallel processing 对OMP_NUM_线程和numactl NUMA内核绑定感到困惑

Parallel processing 对OMP_NUM_线程和numactl NUMA内核绑定感到困惑,parallel-processing,openmp,cpu,intel,numactl,Parallel Processing,Openmp,Cpu,Intel,Numactl,我对同一个python命令的多次启动如何绑定到NUMA Xeon机器上的内核感到困惑 我读到OMP\u NUM\u THREADSenv var设置为numactl进程启动的线程数。因此,如果我在超线程HT机器(下面的lscpu输出)上运行带有OMP_NUM_THREADS=4的numactl--physcpubind=4-7--membind=0 python-u test.py,它会将这个numactl进程限制为4个线程。 但由于机器有HT,我不清楚上面的4-7是4物理还是4逻辑 如何找到

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

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

  • 如何找到
    0-23,96-119
    中的哪个numa-node-0内核是物理内核,哪些是逻辑内核?
    96-119
    都是逻辑性的还是分散的

  • 如果
    4-7
    都是物理核,那么启用HT时只需要2个物理核,那么其他2个物理核会发生什么情况

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

(根据我有限的理解,我可以在
sh
shell中启动命令
python main.py
20次,使用不同的numactl绑定,OMP_NUM_线程仍然适用,即使我没有在任何地方显式使用MPI库,对吗?)

我了解到OMP_NUM_THREADS env var设置为numactl进程启动的线程数

numactl
不启动线程。它控制进程或共享内存的NUMA策略。但是,OpenMP运行时可能会根据
numactl
设置的环境调整某个区域创建的线程数(尽管该标准未定义此行为)。您应该使用环境变量
OMP\u NUM\u THREADS
来设置线程数。您可以使用环境变量
OMP\u DISPLAY\u ENV
检查OpenMP配置

如何找到0-23,96-119中的numa-node-0内核中哪些是物理内核,哪些是逻辑内核?96-119都符合逻辑吗?还是它们相互交错

这有点复杂。物理ID在
/proc/cpuinfo
中可用。它们不能保证在一段时间内保持不变(例如,当机器重新启动时,它们可能会改变),也不能“直观”(即,遵循规则,如线程/内核彼此相邻)。应该避免手动硬编码。e、 BIOS更新或内核更新可能导致以不同的顺序枚举逻辑内核

您可以使用强大的工具hwloc将定义良好的确定性逻辑ID转换为物理ID。在这里,您不能完全确定0和96是共享同一个内核的两个线程(尽管对于您的处理器来说,这可能是正确的,在这里,内核从每个物理内核中枚举一个逻辑内核作为内核0..95,然后为每个物理内核上的另一个逻辑内核枚举96..191)。另一种常见的可能性是Linux连续地执行每个物理核的两个逻辑核,使逻辑核2n和2n+1共享一个物理核

如果4-7都是物理核,那么HT打开时只需要2个物理核,那么其他2个会发生什么

-numctl的physcpubind
接受物理cpu号,如
/proc/cpuinfo
的“处理器”字段所示。因此,此处的
4-7
应解释为物理线程ID。两个线程ID可以引用同一个物理内核(在启用“超线程”的英特尔处理器上总是如此)

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

另外,这取决于所使用的OpenMP运行时的实现(例如GOMP、IOMP等)。OpenMP运行时的初始化通常在遇到第一个并行部分时延迟完成。对于绑定,一些运行时手动读取
/proc/cpuinfo
,而另一些运行时使用
hwloc
。如果需要确定性绑定,那么应该使用
OMP\u PLACES
OMP\u PROC\u BIND
环境变量来告诉运行时使用自定义的用户定义方法而不是默认方法绑定线程


如果希望安全且可移植,请使用以下配置(使用Bash):

OMP\u NUM\u THREADS=4
OMP_PROC_BIND=TRUE
OMP_PLACES={$(hwloc calc——物理输出——sep“},{--intersect PU core:all.PU:0)}
OpenMP线程将安排在OpenMP位置。上述配置配置OpenMP运行时,以便在4个不同的固定内核上静态映射4个线程

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