Windows 7 コンピューターのネットワーク上に MPICH2 がインストールされた Intel MKL の ScaLAPACK を使用しています。次のように、単一のマシンでジョブを実行すると正常に動作します。
mpiexec -n 16 Z:/myprogram.exe # Z:/ is a mapped network drive
さらに、実行するとネットワーク経由で正常に動作しますcpi.exe
(テスト プログラムは MPICH2 と共に提供されます)。
mpiexec -hosts 4 host1 4 host2 4 ... Z:/cpi.exe
私のコード (大きな一次方程式の解) も、単一のマシンで正常に動作します。ただし、次の場合は失敗します。
mpiexec -hosts 2 host1 8 host2 8 Z:/myprogram.exe
メッセージは次のとおりです。
Fatal error in PMPI_Comm_create: Other MPI error, error stack:
PMPI_Comm_create(609)................: MPI_Comm_create(MPI_COMM_WORLD, group=0x8
8000001, new_comm=001DF644) failed
PMPI_Comm_create(590)................:
MPIR_Comm_create_intra(250)..........:
MPIR_Get_contextid(521)..............:
MPIR_Get_contextid_sparse(683).......:
MPIR_Allreduce_impl(712).............:
MPIR_Allreduce_intra(197)............:
allreduce_intra_or_coll_fn(106)......:
MPIR_Allreduce_intra(357)............:
MPIC_Sendrecv(192)...................:
MPIC_Wait(540).......................:
MPIDI_CH3I_Progress(402).............:
MPID_nem_mpich2_blocking_recv(905)...:
MPID_nem_newtcp_module_poll(37)......:
MPID_nem_newtcp_module_connpoll(2656):
gen_cnting_fail_handler(1739)........: connect failed - Semaphore timeout period has expired. (errno 121)
job aborted:
rank: node: exit code[: error message]
0: 10.30.10.182: 1: process 0 exited without calling finalize
1: 10.30.10.184: 123
2: 10.30.10.184: 123
3: 10.30.10.184: 123
4: 10.30.10.184: 123
5: 10.30.10.184: 123
6: 10.30.10.184: 123
7: 10.30.10.184: 123
8: 10.30.10.184: 123
9: 10.30.10.184: 123
10: 10.30.10.184: 123
11: 10.30.10.184: 123
12: 10.30.10.184: 123
13: 10.30.10.184: 123
14: 10.30.10.184: 123
15: 10.30.10.184: 123
私が今知っていることから、問題は私のCコードの早い段階で発生します:
Cblacs_pinfo(&mype, &npe); // OK, gets correct values
Cblacs_get(-1, 0, &icon); // OK, gets correct value
Cblacs_gridinit(&icon, "c", mp, np); // Never returns from this line.
助けやアドバイスをいただければ幸いです。この問題を解決することは、私にとって非常に重要です。
編集: 以下のコードは機能するので、私の MPI インフラストラクチャは問題ないようです..?
int main(int argc, char* argv[])
{
int numprocs, rank, namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
printf("start\n");
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(processor_name, &namelen);
printf( "Process %d on %s out of %d\n" , rank, processor_name, numprocs);
MPI_Finalize();
}