- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I was pleasantly surprised to read that PMI2 & SLURM is supported by Intel MPI in the 2017 release. I tested it, but it fails immediately on my setup. I'm using intel parallel studio 2017 update 4 & SLURM 15.08.13. A simple MPI-program doesn't work:
[donners@int1 pmi2]$ cat mpi.f90
program test
use mpi
implicit none
integer ierr,nprocs,rank
call mpi_init(ierr)
call mpi_comm_size(MPI_COMM_WORLD,nprocs,ierr)
call mpi_comm_rank(mpi_comm_world,rank,ierr)
if (rank .eq. 0) then
print *,'Number of processes: ',nprocs
endif
print*,'I am rank ',rank
call mpi_finalize(ierr)
end
[donners@int1 pmi2]$ mpiifort mpi.f90
[donners@int1 pmi2]$ ldd ./a.out
linux-vdso.so.1 => (0x00007ffcc0364000)
libmpifort.so.12 => /opt/intel/parallel_studio_xe_2017_update4/compilers_and_libraries/linux/mpi/intel64/lib/libmpifort.so.12 (0x00002ad7432a9000)
libmpi.so.12 => /opt/intel/parallel_studio_xe_2017_update4/compilers_and_libraries/linux/mpi/intel64/lib/release_mt/libmpi.so.12 (0x00002ad743652000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002ad744397000)
librt.so.1 => /lib64/librt.so.1 (0x00002ad74459c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ad7447a4000)
libm.so.6 => /lib64/libm.so.6 (0x00002ad7449c1000)
libc.so.6 => /lib64/libc.so.6 (0x00002ad744c46000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ad744fda000)
/lib64/ld-linux-x86-64.so.2 (0x00002ad743086000)
[donners@int1 pmi2]$ I_MPI_PMI2=yes srun -n 1 --mpi=pmi2 ./a.out
INTERNAL ERROR: invalid error code ffffffff (Ring Index out of range) in MPID_Init:2104
Fatal error in MPI_Init: Other MPI error, error stack:
MPIR_Init_thread(805): fail failed
MPID_Init(1716)......: channel initialization failed
MPID_Init(2104)......: fail failed
srun: error: tcn1467: task 0: Exited with exit code 15
srun: Terminating job step 3270641.0
[donners@int1 pmi2]$ srun --version
slurm 15.08.13-Bull.1.0
The same problem occurs on a system with SLURM 17.02.3 (at TACC). What might be the problem here?
With regards,
John
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi John, could you please try to export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so to specify the full path to the libpmi.so library and then run it again? Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi John, Intel MPI has the binary incompatibility with libpmi2.so in some supports when in PMI2 mode and further binary compatibility is needed. Sorry for the inconvenience. Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
thank you for the tip. I ran the test again with I_MPI_PMI_LIBRARY set to the locations of libpmi.so and libpmi2.so:
$ I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so I_MPI_PMI2=yes srun -n 1 --mpi=pmi2 ./a.out srun: job 3324955 queued and waiting for resources srun: job 3324955 has been allocated resources INTERNAL ERROR: invalid error code ffffffff (Ring Index out of range) in MPID_Init:2104 Fatal error in MPI_Init: Other MPI error, error stack: MPIR_Init_thread(805): fail failed MPID_Init(1716)......: channel initialization failed MPID_Init(2104)......: fail failed srun: error: tcn866: task 0: Exited with exit code 15 srun: Terminating job step 3324955.0 $ I_MPI_PMI_LIBRARY=/usr/lib64/libpmi2.so I_MPI_PMI2=yes srun -n 1 --mpi=pmi2 ./a.out srun: job 3324966 queued and waiting for resources srun: job 3324966 has been allocated resources Number of processes: 1 I am rank 0
so it works fine when I point to libpmi2.so (which seems pretty logical now).
The reason that I wanted to use PMI2 was its support for dynamically spawning MPI processes in a SLURM job. I used the following example to test dynamic spawning:
program mpispawn
use mpi
implicit none
integer ierr,errcodes(1),intercomm,pcomm,mpisize,dumm,rank
character(1000) cmd
logical master
call MPI_Init(ierr)
call get_command_argument(0,cmd)
print*,'cmd=',trim(cmd)
call MPI_Comm_get_parent(pcomm,ierr)
if (pcomm.eq.MPI_COMM_NULL) then
print*,'I am the master. Clone myself!'
master=.true.
call MPI_Comm_spawn(cmd,MPI_ARGV_NULL,4,MPI_INFO_NULL,0,MPI_COMM_WORLD,pcomm,errcodes,ierr)
call MPI_Comm_size(pcomm,mpisize,ierr)
print*,'Processes in intercommunicator:',mpisize
dumm=88
call MPI_Bcast(dumm,1,MPI_INTEGER,MPI_ROOT,pcomm,ierr)
else
print*,'I am a clone. Use me'
master=.false.
call MPI_Bcast(dumm,1,MPI_INTEGER,0,pcomm,ierr)
endif
call MPI_Comm_rank(pcomm,rank,ierr)
print*,'rank,master,dumm=',rank,master,dumm
call sleep(10)
call MPI_Barrier(pcomm,ierr)
call MPI_Finalize(ierr)
end
I submitted this test program to SLURM with the following job script:
#!/bin/bash #SBATCH -n 24 #SBATCH -p short #SBATCH -c 1 #SBATCH --mem-per-cpu=1000 #SBATCH -t 5:00 # use PMI2 export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi2.so export PMI_DEBUG=1 export I_MPI_PMI2=yes ldd ./mpi.impi2017 srun -v --mpi=pmi2 -l -n 1 ./mpi.impi2017
The job output is:
linux-vdso.so.1 => (0x00007ffeff7b9000)
libmpifort.so.12 => /opt/intel/parallel_studio_xe_2017_update4/compilers_and_libraries/linux/mpi/intel64/lib/libmpifort.so.12 (0x00002ac75efff000)
libmpi.so.12 => /opt/intel/parallel_studio_xe_2017_update4/compilers_and_libraries/linux/mpi/intel64/lib/debug_mt/libmpi.so.12 (0x00002ac75f3a8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000034bec00000)
librt.so.1 => /lib64/librt.so.1 (0x00000034c0000000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034bf400000)
libm.so.6 => /lib64/libm.so.6 (0x00000034bf800000)
libc.so.6 => /lib64/libc.so.6 (0x00000034bf000000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000034c0400000)
/lib64/ld-linux-x86-64.so.2 (0x00000034be800000)
srun: defined options for program `srun'
srun: --------------- ---------------------
srun: user : `donners'
srun: uid : 31046
srun: gid : 31060
srun: cwd : /nfs/home1/donners/Tests/mpispawn
srun: ntasks : 1 (set)
srun: cpus_per_task : 1
srun: nodes : 1 (set)
srun: jobid : 3325083 (default)
srun: partition : default
srun: profile : `NotSet'
srun: job name : `job.intel'
srun: reservation : `(null)'
srun: burst_buffer : `(null)'
srun: wckey : `(null)'
srun: cpu_freq_min : 4294967294
srun: cpu_freq_max : 4294967294
srun: cpu_freq_gov : 4294967294
srun: switches : -1
srun: wait-for-switches : -1
srun: distribution : unknown
srun: cpu_bind : default
srun: mem_bind : default
srun: verbose : 1
srun: slurmd_debug : 0
srun: immediate : false
srun: label output : true
srun: unbuffered IO : false
srun: overcommit : false
srun: threads : 60
srun: checkpoint_dir : /var/slurm/checkpoint
srun: wait : 60
srun: nice : -2
srun: account : (null)
srun: comment : (null)
srun: dependency : (null)
srun: exclusive : false
srun: bcast : false
srun: qos : (null)
srun: constraints : mincpus-per-node=1 mem-per-cpu=1000M
srun: geometry : (null)
srun: reboot : yes
srun: rotate : no
srun: preserve_env : false
srun: network : (null)
srun: propagate : NONE
srun: prolog : /nfs/admin/scripts/admin/slurm_srunprolog
srun: epilog : /nfs/admin/scripts/admin/slurm_srunepilog
srun: mail_type : NONE
srun: mail_user : (null)
srun: task_prolog : (null)
srun: task_epilog : (null)
srun: multi_prog : no
srun: sockets-per-node : -2
srun: cores-per-socket : -2
srun: threads-per-core : -2
srun: ntasks-per-node : -2
srun: ntasks-per-socket : -2
srun: ntasks-per-core : -2
srun: plane_size : 4294967294
srun: core-spec : NA
srun: power :
srun: sicp : 0
srun: remote command : `./mpi.impi2017'
srun: launching 3325083.0 on host tcn1514, 1 tasks: 0
srun: route default plugin loaded
srun: Node tcn1514, 1 tasks started
0: cmd=/nfs/home1/donners/Tests/mpispawn/./mpi.impi2017
0: I am the master. Clone myself!
0: Fatal error in MPI_Init: Other MPI error, error stack:
0: MPIR_Init_thread(805).......: fail failed
0: MPID_Init(1949).............: spawn process group was unable to obtain parent port name from the channel
0: MPIDI_CH3_GetParentPort(465): PMI2 KVS_Get failed: PARENT_ROOT_PORT_NAME
1: Fatal error in MPI_Init: Other MPI error, error stack:
1: MPIR_Init_thread(805).......: fail failed
1: MPID_Init(1949).............: spawn process group was unable to obtain parent port name from the channel
1: MPIDI_CH3_GetParentPort(465): PMI2 KVS_Get failed: PARENT_ROOT_PORT_NAME
2: Fatal error in MPI_Init: Other MPI error, error stack:
2: MPIR_Init_thread(805).......: fail failed
2: MPID_Init(1949).............: spawn process group was unable to obtain parent port name from the channel
2: MPIDI_CH3_GetParentPort(465): PMI2 KVS_Get failed: PARENT_ROOT_PORT_NAME
3: Fatal error in MPI_Init: Other MPI error, error stack:
3: MPIR_Init_thread(805).......: fail failed
3: MPID_Init(1949).............: spawn process group was unable to obtain parent port name from the channel
3: MPIDI_CH3_GetParentPort(465): PMI2 KVS_Get failed: PARENT_ROOT_PORT_NAME
srun: Job step aborted: Waiting up to 32 seconds for job step to finish.
0: slurmstepd: *** STEP 3325083.1 ON tcn1514 CANCELLED AT 2017-07-14T10:39:01 ***
srun: error: tcn1514: tasks 0-3: Exited with exit code 1
srun: Terminating job step 3325083.1
This error message looks similar to a bug report for MPICH: https://github.com/pmodels/mpich/issues/1814
Maybe the bug fix mentioned at the end of that report is also applicable to Intel MPI. I get the same error message with the latest Intel MPI 2018b1.
Cheers,
John
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page