我正在研究 ScaLAPACK 并尝试习惯使用 ScaLAPACK 必不可少的 BLACS 例程。
我上过一些关于 MPI 的初级课程,所以对 MPI_COMM_WORLD 的东西有一些粗略的了解,但对它内部的工作原理等没有深入的了解。
无论如何,我正在尝试使用 BLACS 例程按照代码打招呼。
program hello_from_BLACS
use MPI
implicit none
integer :: info, nproc, nprow, npcol, &
myid, myrow, mycol, &
ctxt, ctxt_sys, ctxt_all
call BLACS_PINFO(myid, nproc)
! get the internal default context
call BLACS_GET(0, 0, ctxt_sys)
! set up a process grid for the process set
ctxt_all = ctxt_sys
call BLACS_GRIDINIT(ctxt_all, 'c', nproc, 1)
call BLACS_BARRIER(ctxt_all, 'A')
! set up a process grid of size 3*2
ctxt = ctxt_sys
call BLACS_GRIDINIT(ctxt, 'c', 3, 2)
if (myid .eq. 0) then
write(6,*) ' myid myrow mycol nprow npcol'
endif
(**) call BLACS_BARRIER(ctxt_sys, 'A')
! all processes not belonging to 'ctxt' jump to the end of the program
if (ctxt .lt. 0) goto 1000
! get the process coordinates in the grid
call BLACS_GRIDINFO(ctxt, nprow, npcol, myrow, mycol)
write(6,*) 'hello from process', myid, myrow, mycol, nprow, npcol
1000 continue
! return all BLACS contexts
call BLACS_EXIT(0)
stop
end program
'mpirun -np 10 ./exe' 的输出就像,
hello from process 0 0 0 3 2
hello from process 4 1 1 3 2
hello from process 1 1 0 3 2
myid myrow mycol nprow npcol
hello from process 5 2 1 3 2
hello from process 2 2 0 3 2
hello from process 3 0 1 3 2
除了我在代码左侧标记为 (**) 的 'BLACS_BARRIER' 行之外,一切似乎都运行良好。
我已经把那行放在下面的输出中,它的标题行总是打印在它的顶部。
myid myrow mycol nprow npcol
hello from process 0 0 0 3 2
hello from process 4 1 1 3 2
hello from process 1 1 0 3 2
hello from process 5 2 1 3 2
hello from process 2 2 0 3 2
hello from process 3 0 1 3 2
那么问题来了,
我已经尝试将 BLACS_BARRIER 用于“ctxt_sys”、“ctxt_all”和“ctxt”,但它们都没有输出第一次打印标题行的输出。我也试过 MPI_Barrier(MPI_COMM_WORLD,info),但也没有用。我是否以错误的方式使用障碍物?
另外,我在使用BLACS_BARRIER到'ctxt'时得到了SIGSEGV,并且在执行mpirun时使用了6个以上的进程。为什么在这种情况下会发生 SIGSEGV?
感谢您阅读这个问题。