# Scatter the processes across sockets

**URL:** <https://community.intel.com/t/scatter-the-processes-across-sockets/124658>\
**Category:** Intel® MPI Library\
**Tags:** intel-mpi\
**Created:** [June 27, 2024, 12:10am UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658 "2024-06-27T00:10:59Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![ZQyouOSC](https://avatars.discourse-cdn.com/v4/letter/z/276EF2/32.png) [@ZQyouOSC](https://community.intel.com/u/ZQyouOSC)\
**Post date:** [June 27, 2024, 12:10am UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658/1 "2024-06-27T00:10:59Z")

</div>

Hello,

I am researching how to pin processes across sockets using the I\_MPI\_PIN\_DOMAIN and I\_MPI\_PIN\_ORDER environment variables. I have tried many combinations, but none of them have worked. I used Intel MPI 2021.12.1 and ran [TACC](https://github.com/TACC/amask)&nbsp;[amask](https://github.com/TACC/amask) on two systems: one equipped with two Xeon Platinum 8470 CPUs and the other equipped with two Xeon CPU Max 9470 CPUs.

With the default settings, I ran the following command:

```auto
mpiexec -n 4 amask_mpi

```

and I got the process placement in bunch order as expected:

```auto
<span class=""><span class="">     </span>Each row of matrix is a mask for a Hardware Thread (hwt).<span class="">                                                                                                                            </span></span><br><span class=""><span class="">     </span>CORE ID<span class="">  </span>= matrix digit + column group # in |...|<span class="">                                                                                                                                       </span></span><br><span class=""><span class="">     </span>A set mask bit (proc-id) = core id + add 104 to each additional row. <span class="">                                                                                                                   </span></span><br><span class=""><span class="">                                                                                                                                                                                          </span></span><br><span class="">rank |<span class="">    </span>0<span class="">    </span>| <span class="">  </span>10<span class="">    </span>| <span class="">  </span>20<span class="">    </span>| <span class="">  </span>30<span class="">    </span>| <span class="">  </span>40<span class="">    </span>| <span class="">  </span>50<span class="">    </span>| <span class="">  </span>60<span class="">    </span>| <span class="">  </span>70<span class="">    </span>| <span class="">  </span>80<span class="">    </span>| <span class="">  </span>90<span class="">    </span>| <span class="">  </span>100 <span class="">  </span>| <span class="">                                                       </span></span><br><span class="">0000 0---4---8---2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2-----------<span class="">                                                                         </span></span><br><span class="">0001 --2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2---6---0---4---------<span class="">                                                                   </span></span><br><span class="">0002 -1---5---9---3---7---1---5---9---3---7---1---5---9---3---7---1---5---9---3---7---1---5---9---3----------<span class="">                                                                   </span></span><br><span class="">0003 ---3---7---1---5---9---3---7---1---5---9---3---7---1---5---9---3---7---1---5---9---3---7---1---5--------<span class="">       </span></span>

```

The first two processes are bound to the first and second NUMA nodes in the first socket, and the remaining two processes are bound to the first and second NUMA nodes in the second socket.

I can also achieve the process placement in compact order with the following variables:

```auto
<span class="">I_MPI_PIN_DOMAIN = core<span class="">                                                                                                                            </span></span><br><span class="">I_MPI_PIN_ORDER = compact<span class="">   </span></span>

```

and I got the processes placed in the first NUMA node:

```auto
<span class=""><span class="">     </span>Each row of matrix is a mask for a Hardware Thread (hwt). <span class="">                                                                                                                               </span></span><br><span class=""><span class="">     </span>CORE ID<span class="">  </span>= matrix digit + column group # in |...| <span class="">                                                                                                                                       </span></span><br><span class=""><span class="">     </span>A set mask bit (proc-id) = core id + add 104 to each additional row.<span class="">                                                                                                                     </span></span><br><span class=""><span class="">                                                                                                                                                                                             </span></span><br><span class="">rank |<span class="">    </span>0<span class="">    </span>| <span class="">  </span>10<span class="">    </span>| <span class="">  </span>20<span class="">    </span>| <span class="">  </span>30<span class="">    </span>| <span class="">  </span>40<span class="">    </span>| <span class="">  </span>50<span class="">    </span>| <span class="">  </span>60<span class="">    </span>| <span class="">  </span>70<span class="">    </span>| <span class="">  </span>80<span class="">    </span>| <span class="">  </span>90<span class="">    </span>| <span class="">  </span>100 <span class="">  </span>| <span class="">                                                                         </span></span><br><span class="">0000 0-------------------------------------------------------------------------------------------------------<span class="">                                                                                 </span></span><br><span class="">0001 --------8-----------------------------------------------------------------------------------------------<span class="">                                                                                 </span></span><br><span class="">0002 ----------------6---------------------------------------------------------------------------------------<span class="">                                                                                 </span></span><br><span class="">0003 ------------------------4------------------------------------------------------------------------------- <span class="">                                           </span></span>

```

I have been experimenting with different values of I\_MPI\_PIN\_DOMAIN and I\_MPI\_PIN\_ORDER to achieve process placement in a scatter order across sockets. For example, I want the first and third processes to be bound to the first socket, and the second and fourth processes to be bound to the second socket. However, I have not had any success in finding a working combination. Could you please provide any suggestions? Thank you.

---

<div class="post-metadata">

**Author:** ![TobiasK](https://avatars.discourse-cdn.com/v4/letter/t/00C7FD/32.png) [@TobiasK](https://community.intel.com/u/TobiasK)\
**Post date:** [July 1, 2024, 4:35pm UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658/2 "2024-07-01T16:35:37Z")

</div>

@ZQyouOSC &nbsp;  
Can you please post the output after setting export I\_MPI\_DEBUG=10 ?

---

<div class="post-metadata">

**Author:** ![ZQyou](https://avatars.discourse-cdn.com/v4/letter/z/3700C4/32.png) [@ZQyou](https://community.intel.com/u/ZQyou)\
**Post date:** [July 3, 2024, 3:09pm UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658/3 "2024-07-03T15:09:03Z")

</div>

Sure. The following is the output with&nbsp;I\_MPI\_DEBUG=10,&nbsp;I\_MPI\_PIN\_DOMAIN=core and&nbsp;I\_MPI\_PIN\_ORDER=scatter:

```auto
<span class="">[0] MPI startup(): Intel(R) MPI Library, Version 2021.10<span class="">  </span>Build 20230619 (id: c2e19c2f3e)</span><br><span class="">[0] MPI startup(): Copyright (C) 2003-2023 Intel Corporation.<span class="">  </span>All rights reserved.</span><br><span class="">[</span><span class="">0</span><span class="">]</span><span class=""> MPI startup(): library kind: release</span><br><span class="">[0] MPI startup(): shm segment size (342 MB per rank) * (4 local ranks) = 1368 MB total</span><br><span class="">[0] MPI startup(): libfabric loaded: libfabric.so.1 </span><br><span class="">[0] MPI startup(): libfabric version: 1.18.0-impi</span><br><span class="">[0] MPI startup(): max number of MPI_Request per vci: 67108864 (pools: 1)</span><br><span class="">[0] MPI startup(): libfabric provider: mlx </span><br><span class="">[0] MPI startup(): File "/apps/spack/0.21/cardinal/linux-rhel9-sapphirerapids/intel-oneapi-mpi/intel/2021.10.0/2021.10.0-a2ei2t4/mpi/2021.10.0/etc/tuning_spr_shm-ofi_mlx_100.dat" not found</span><br><span class="">[0] MPI startup(): Load tuning file: "/apps/spack/0.21/cardinal/linux-rhel9-sapphirerapids/intel-oneapi-mpi/intel/2021.10.0/2021.10.0-a2ei2t4/mpi/2021.10.0/etc/tuning_spr_shm-ofi.dat"</span><br><span class="">[0] MPI startup(): threading: mode: direct</span><br><span class="">[0] MPI startup(): threading: vcis: 1</span><br><span class="">[0] MPI startup(): threading: app_threads: -1</span><br><span class="">[0] MPI startup(): threading: runtime: generic</span><br><span class="">[0] MPI startup(): threading: progress_threads: 0</span><br><span class="">[0] MPI startup(): threading: async_progress: 0</span><br><span class="">[0] MPI startup(): threading: lock_level: global</span><br><span class="">[0] MPI startup(): tag bits available: 20 (TAG_UB value: 1048575) </span><br><span class="">[0] MPI startup(): source bits available: 21 (Maximal number of rank: 2097151) </span><br><span class="">[0] MPI startup(): Rank<span class="">    </span>Pid<span class="">      </span>Node name<span class="">          </span>Pin cpu </span><br><span class="">[0] MPI startup(): 0 <span class="">      </span>776163 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{0} </span><br><span class="">[0] MPI startup(): 1 <span class="">      </span>776164 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{8} </span><br><span class="">[0] MPI startup(): 2 <span class="">      </span>776165 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{16}</span><br><span class="">[0] MPI startup(): 3 <span class="">      </span>776166 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{24}</span><br><span class="">[0] MPI startup(): I_MPI_CC=icc</span><br><span class="">[0] MPI startup(): I_MPI_CXX=icpc</span><br><span class="">[0] MPI startup(): I_MPI_FC=ifort</span><br><span class="">[0] MPI startup(): I_MPI_F90=ifort</span><br><span class="">[0] MPI startup(): I_MPI_F77=ifort</span><br><span class="">[0] MPI startup(): I_MPI_ROOT=/apps/spack/0.21/cardinal/linux-rhel9-sapphirerapids/intel-oneapi-mpi/intel/2021.10.0/2021.10.0-a2ei2t4/mpi/2021.10.0</span><br><span class="">[0] MPI startup(): I_MPI_BIND_WIN_ALLOCATE=localalloc</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_BOOTSTRAP_EXEC_EXTRA_ARGS=--external-launcher</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_TOPOLIB=hwloc</span><br><span class="">[0] MPI startup(): I_MPI_JOB_RESPECT_PROCESS_PLACEMENT=0</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_BRANCH_COUNT=-1</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_BOOTSTRAP=slurm</span><br><span class="">[0] MPI startup(): I_MPI_RETURN_WIN_MEM_NUMA=0</span><br><span class="">[0] MPI startup(): I_MPI_PIN_DOMAIN=core</span><br><span class="">[0] MPI startup(): I_MPI_PIN_ORDER=scatter</span><br><span class="">[0] MPI startup(): I_MPI_INTERNAL_MEM_POLICY=default</span><br><span class="">[0] MPI startup(): I_MPI_DEBUG=10</span><br><br><span class=""><span class="">     </span>Each row of matrix is a mask for a Hardware Thread (hwt).</span><br><span class=""><span class="">     </span>CORE ID<span class="">  </span>= matrix digit + column group # in |...|</span><br><span class=""><span class="">     </span>A set mask bit (proc-id) = core id + add 104 to each additional row.</span><br><br><span class="">rank |<span class="">    </span>0<span class="">    </span>| <span class="">  </span>10<span class="">    </span>| <span class="">  </span>20<span class="">    </span>| <span class="">  </span>30<span class="">    </span>| <span class="">  </span>40<span class="">    </span>| <span class="">  </span>50<span class="">    </span>| <span class="">  </span>60<span class="">    </span>| <span class="">  </span>70<span class="">    </span>| <span class="">  </span>80<span class="">    </span>| <span class="">  </span>90<span class="">    </span>| <span class="">  </span>100 <span class="">  </span>|</span><br><span class="">0000 0-------------------------------------------------------------------------------------------------------</span><br><span class="">0001 --------8-----------------------------------------------------------------------------------------------</span><br><span class="">0002 ----------------6---------------------------------------------------------------------------------------</span><br><span class="">0003 ------------------------4-------------------------------------------------------------------------------</span>

```

---

<div class="post-metadata">

**Author:** ![TobiasK](https://avatars.discourse-cdn.com/v4/letter/t/00C7FD/32.png) [@TobiasK](https://community.intel.com/u/TobiasK)\
**Post date:** [July 3, 2024, 3:56pm UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658/4 "2024-07-03T15:56:20Z")

</div>

It seems you are using Slurm. If you are using Slurm, please use srun und manage pinning through Slurm.

To use mpiexec/mpirun and ignore the Slurm settings please follow the settings here:

> **[Job Schedulers Support](https://www.intel.com/content/www/us/en/docs/mpi-library/developer-guide-linux/2021-13/job-schedulers-support.html)**
>
> This Developer Guide contains instructions for running, debugging, and tuning the Intel® MPI Library.

---

<div class="post-metadata">

**Author:** ![ZQyou](https://avatars.discourse-cdn.com/v4/letter/z/3700C4/32.png) [@ZQyou](https://community.intel.com/u/ZQyou)\
**Post date:** [July 3, 2024, 4:21pm UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658/5 "2024-07-03T16:21:52Z")

</div>

Yes, I am using Slurm, but I am sure that I have used the IntelMPI Hydra process manager. When I use Slurm, I have set the following:

```auto
<span class="">I_MPI_HYDRA_BOOTSTRAP=slurm</span><br><span class="">I_MPI_PMI_LIBRARY=/usr/lib64/libpmi2.so</span>

```

I had these settings to use the Hydra process manager when I obtained the previous output I sent:

```auto
<span class="">export</span><span class=""> -n I_MPI_HYDRA_BOOTSTRAP I_MPI_PMI_LIBRARY</span>

```

I am confident because Slurm CPU binding control is not working.

I also tried using SSH as the Hydra bootstrap, but I got the same result.

```auto
<span class="">$ export -n I_MPI_HYDRA_BOOTSTRAP I_MPI_PMI_LIBRARY <br>$ export I_MPI_HYDRA_BOOTSTRAP=ssh<br>$ mpiexec -n 4 bin/amask_mpi<br><br>[0] MPI startup(): Intel(R) MPI Library, Version 2021.10<span class="">  </span>Build 20230619 (id: c2e19c2f3e)</span><br><span class="">[0] MPI startup(): Copyright (C) 2003-2023 Intel Corporation.<span class="">  </span>All rights reserved.</span><br><span class="">[0] MPI startup(): library kind: release</span><br><span class="">[0] MPI startup(): shm segment size (342 MB per rank) * (4 local ranks) = 1368 MB total</span><br><span class="">[0] MPI startup(): libfabric loaded: libfabric.so.1</span><br><span class="">[0] MPI startup(): libfabric version: 1.18.0-impi</span><br><span class="">[0] MPI startup(): max number of MPI_Request per vci: 67108864 (pools: 1)</span><br><span class="">[0] MPI startup(): libfabric provider: mlx</span><br><span class="">[0] MPI startup(): File "/apps/spack/0.21/cardinal/linux-rhel9-sapphirerapids/intel-oneapi-mpi/intel/2021.10.0/2021.10.0-a2ei2t4/mpi/2021.10.0/etc/tuning_spr_shm-ofi_mlx_100.dat" not found</span><br><span class="">[0] MPI startup(): Load tuning file: "/apps/spack/0.21/cardinal/linux-rhel9-sapphirerapids/intel-oneapi-mpi/intel/2021.10.0/2021.10.0-a2ei2t4/mpi/2021.10.0/etc/tuning_spr_shm-ofi.dat"</span><br><span class="">[0] MPI startup(): threading: mode: direct</span><br><span class="">[0] MPI startup(): threading: vcis: 1</span><br><span class="">[0] MPI startup(): threading: app_threads: -1</span><br><span class="">[0] MPI startup(): threading: runtime: generic</span><br><span class="">[0] MPI startup(): threading: progress_threads: 0</span><br><span class="">[0] MPI startup(): threading: async_progress: 0</span><br><span class="">[0] MPI startup(): threading: lock_level: global</span><br><span class="">[0] MPI startup(): tag bits available: 20 (TAG_UB value: 1048575)</span><br><span class="">[0] MPI startup(): source bits available: 21 (Maximal number of rank: 2097151)</span><br><span class="">[0] MPI startup(): Rank<span class="">    </span>Pid<span class="">      </span>Node name<span class="">          </span>Pin cpu</span><br><span class="">[0] MPI startup(): 0 <span class="">      </span>783094 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{0}</span><br><span class="">[0] MPI startup(): 1 <span class="">      </span>783095 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{8}</span><br><span class="">[0] MPI startup(): 2 <span class="">      </span>783096 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{16}</span><br><span class="">[0] MPI startup(): 3 <span class="">      </span>783097 <span class="">  </span>c1002.ten.osc.edu<span class="">  </span>{24}</span><br><span class="">[0] MPI startup(): I_MPI_CC=icc</span><br><span class="">[0] MPI startup(): I_MPI_CXX=icpc</span><br><span class="">[0] MPI startup(): I_MPI_FC=ifort</span><br><span class="">[0] MPI startup(): I_MPI_F90=ifort</span><br><span class="">[0] MPI startup(): I_MPI_F77=ifort</span><br><span class="">[0] MPI startup(): I_MPI_ROOT=/apps/spack/0.21/cardinal/linux-rhel9-sapphirerapids/intel-oneapi-mpi/intel/2021.10.0/2021.10.0-a2ei2t4/mpi/2021.10.0</span><br><span class="">[0] MPI startup(): I_MPI_BIND_WIN_ALLOCATE=localalloc</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_BOOTSTRAP_EXEC_EXTRA_ARGS=--external-launcher</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_TOPOLIB=hwloc</span><br><span class="">[0] MPI startup(): I_MPI_JOB_RESPECT_PROCESS_PLACEMENT=0</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_BRANCH_COUNT=-1</span><br><span class="">[0] MPI startup(): I_MPI_HYDRA_BOOTSTRAP=ssh</span><br><span class="">[0] MPI startup(): I_MPI_RETURN_WIN_MEM_NUMA=0</span><br><span class="">[0] MPI startup(): I_MPI_PIN_DOMAIN=core</span><br><span class="">[0] MPI startup(): I_MPI_PIN_ORDER=scatter</span><br><span class="">[0] MPI startup(): I_MPI_INTERNAL_MEM_POLICY=default</span><br><span class="">[0] MPI startup(): I_MPI_DEBUG=10</span><br><br><span class=""><span class="">     </span>Each row of matrix is a mask for a Hardware Thread (hwt).</span><br><span class=""><span class="">     </span>CORE ID<span class="">  </span>= matrix digit + column group # in |...|</span><br><span class=""><span class="">     </span>A set mask bit (proc-id) = core id + add 104 to each additional row.</span><br><br><span class="">rank |<span class="">    </span>0<span class="">    </span>| <span class="">  </span>10<span class="">    </span>| <span class="">  </span>20<span class="">    </span>| <span class="">  </span>30<span class="">    </span>| <span class="">  </span>40<span class="">    </span>| <span class="">  </span>50<span class="">    </span>| <span class="">  </span>60<span class="">    </span>| <span class="">  </span>70<span class="">    </span>| <span class="">  </span>80<span class="">    </span>| <span class="">  </span>90<span class="">    </span>| <span class="">  </span>100 <span class="">  </span>|</span><br><span class="">0000 0-------------------------------------------------------------------------------------------------------</span><br><span class="">0001 --------8-----------------------------------------------------------------------------------------------</span><br><span class="">0002 ----------------6---------------------------------------------------------------------------------------</span><br><span class="">0003 ------------------------4-------------------------------------------------------------------------------</span> 

```

---

<div class="post-metadata">

**Author:** ![TobiasK](https://avatars.discourse-cdn.com/v4/letter/t/00C7FD/32.png) [@TobiasK](https://community.intel.com/u/TobiasK)\
**Post date:** [July 8, 2024, 10:28am UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658/6 "2024-07-08T10:28:50Z")

</div>

@ZQyouOSC

can you please try the pinning simulator:

> **[Pinning Simulator for Intel® MPI Library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/mpi-library-pinning-simulator.html)**
>
> Visualize your pinning configuration to select the optimal settings using Intel® MPI Library.

Also please set  
I\_MPI\_PIN\_RESPECT\_HCA=0  
I\_MPI\_PIN\_RESPECT\_CPUSET=0

Best

---

<div class="post-metadata">

**Author:** ![ZQyouOSC](https://avatars.discourse-cdn.com/v4/letter/z/276EF2/32.png) [@ZQyouOSC](https://community.intel.com/u/ZQyouOSC)\
**Post date:** [July 10, 2024, 6:03pm UTC](https://community.intel.com/t/scatter-the-processes-across-sockets/124658/7 "2024-07-10T18:03:10Z")

</div>

Hello,

I have tried the simulator, and it suggests the following command line to achieve scatter pinning across sockets:

```auto
I_MPI_PIN_DOMAIN=core I_MPI_PIN_ORDER=scatter I_MPI_PIN_CELL=unit mpiexec -n 4

```

I used the same environment variables along with the other two you suggested previously. However, I still got the compact-order result as I reported.
