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

Parallel processing 当所有lscpu显示4个numa节点时,理解使用--membind=1或3失败的numactl,parallel-processing,openmp,cpu,numa,numactl,Parallel Processing,Openmp,Cpu,Numa,Numactl,我一直在试图解决numactl命令失败的问题,但看起来可能是我不完全理解numactl或OMP\u-MP\u-THREAD的工作方式 我正在尝试使用numactl--physcpubind=24-27--membind=1 python-u main.py运行绑定到numa-node-1的4个CPU的1个实例的脚本main.py,因为lscpu显示绑定到numa-node-1的CPU 24-27 但是我得到了以下错误 libnuma: Warning: node argument 1 is ou

我一直在试图解决
numactl
命令失败的问题,但看起来可能是我不完全理解
numactl
OMP\u-MP\u-THREAD
的工作方式

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

但是我得到了以下错误

libnuma: Warning: node argument 1 is out of range
<1> is invalid
numactl——硬件:

available: 4 nodes (0-3)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
node 0 size: 64106 MB
node 0 free: 28478 MB
node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
node 1 size: 0 MB
node 1 free: 0 MB
node 2 cpus: 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
node 2 size: 64478 MB
node 2 free: 45446 MB
node 3 cpus: 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
node 3 size: 0 MB
node 3 free: 0 MB
node distances:
node   0   1   2   3 
  0:  10  21  21  21 
  1:  21  10  21  21 
  2:  21  21  10  21 
  3:  21  21  21  10 

这里的问题是一些NUMA节点没有填充任何内存。通过
numactl--hardware
命令的输出,可以看到节点1和3上的内存大小为0。因此,试图将内存绑定到这些节点是一场失败的战斗

请注意:9242 CPU通常(嗯,AFAIK)仅适用于焊接内存模块,因此您的机器上不太可能缺少内存DIMM。因此,要么是您的机器在硬件级别出现了严重错误,要么是某种虚拟化层将部分内存隐藏起来。无论哪种方式,配置都是非常错误的,需要进行更深入的调查

编辑:回答额外的问题

  • 物理核心与硬件线程编号:启用超线程时,物理核心不再有实际编号。操作系统看到的所有内核实际上都是硬件线程。简单地说,在这里的例子中,物理核0被视为两个逻辑核0和96。物理核1被视为逻辑核1和97,依此类推

  • Numactl失败:已回答

  • NUMA节点编号:一般来说,它取决于机器的BIOS。因此,当一个节点上有N个物理套接字,每个套接字有P个核时,有两个主要的编号选项。这两个选项如下(命名是我的,不确定是否有正式的):

  • 传播:
    • 插座0:磁芯0,N,2N,3N,…(P-1)N
    • 插座1:芯线1,N+1,2N+1,…(P-1)N+1
    • 插座N-1:芯线N-1、2N-1、…、PN-1
  • 线性:
    • 插座0:芯线0,1,…,P-1
    • 插座1:芯线P,P+1,…,2P-1
    • 插座N-1:芯线(N-1)P,…,NP-1
  • 如果超线程被激活,您只需为每个套接字添加p个核,并对它们进行编号,这样编号为C和C+PN的核实际上是同一物理核的2个HW线程

    在这里,您看到的是线性编号

  • numactl--physcpubind=0-3
    :这限制了允许将您启动的命令调度到传入参数列表中的逻辑核心的范围,即核心0、1、2和3。但这并不强制您启动的代码一次使用多个内核。对于OpenMP代码,您仍然需要为此设置
    OMP\u NUM\u THREADS
    环境变量

  • OMP_NUM_线程
    和HT:
    OMP_NUM_线程
    只告诉要启动多少线程,它不关心内核,它们是物理的还是逻辑的

  • numactl报告的距离:我不太确定报告值的确切含义/准确性,但以下是我在需要时如何解释它们:对我来说,它对应于一些相对内存访问延迟。我不知道这些值是测量的还是猜测的,这些值是周期还是纳秒,但它是这么说的:

    • NUMA节点0的内核对连接到NUMA节点0的内存的访问延迟为10,对所有其他NUMA节点的访问延迟为21
    • NUMA节点1的内核对连接到NUMA节点1的内存的访问延迟为10,对所有其他NUMA节点的访问延迟为21
    • etc
      但关键的一点是,访问距离内存的时间是访问本地内存的2.1倍

  • 一个不影响答案的小细节,但OpenMP没有令人羡慕的OMP\u MP\u线程。也许你指的是OMP_NUM_线程?是的,我指的是OMP_NUM_线程。OMP_NUM_THREADS=4是否意味着在该
    numactl
    命令中绑定的所有CPU只有4个线程?如果CPU有超线程(就像在本例中,每个phys CPU有2个线程),该怎么办,这4个线程包括超线程还是不包括超线程?知道
    10
    21
    的距离在
    numactl--hardware
    的输出中意味着什么吗?OMP\u NUM\u线程完全不关心任何硬件属性。它告诉OpenMP运行时系统要创建多少软件线程,就是这样。如果你要求42个线程(或420个),即使你在单核上运行,它也会尝试创建,没有SMT机器。所以当我运行
    numactl--physcpubind=0-3--membind=0 python-u main.py
    它使用了多少个physc CPU?4或2物理和4逻辑?如何知道NUMA node0 CPU中的哪一个:0-23,96-119是由于超线程而产生的物理和逻辑内核?此命令是否还需要
    OMP_NUM_THREADS=4
    来确保仅使用4个CPU,或者它本身就足够了?关于HT(超线程)的同样问题也出现在
    OMP_NUM_THREADS=4
    ——不清楚是4个HT核还是仅仅是物理核。知道
    10
    21
    numactl--hardware
    的输出中意味着什么距离吗<代码>节点0 1 2 3 0:10 21 21 21 1:21 10 21 21 2:21 21 10 21 3:21 21 21 21 10
    @JoeBlack我希望我回答了你所有的问题如果“OMP_NUM_THREADS只告诉要启动多少线程”,那么在这种情况下,在HT打开的情况下,为了充分利用内核,它们应该使用OMP_NUM_THREADS=2*物理内核来运行?因此,要在4个物理内核上启动1个代码实例,命令应该是
    --physcpubind=0-3,96-99--membind=0
    ,并且
    available: 4 nodes (0-3)
    node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
    node 0 size: 64106 MB
    node 0 free: 28478 MB
    node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    node 1 size: 0 MB
    node 1 free: 0 MB
    node 2 cpus: 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
    node 2 size: 64478 MB
    node 2 free: 45446 MB
    node 3 cpus: 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
    node 3 size: 0 MB
    node 3 free: 0 MB
    node distances:
    node   0   1   2   3 
      0:  10  21  21  21 
      1:  21  10  21  21 
      2:  21  21  10  21 
      3:  21  21  21  10