2010-11-23 2 views
0

MPI_Comm_spawn을 사용하여 원격 노드에서 작업자 프로세스를 시작하는 방법은 무엇입니까? 는 OpenMPI 1.4.3를 사용원격 노드의 mpi_comm_spawn

, 나는이 코드를 시도했다 :

MPI_Info info; 
MPI_Info_create(&info); 
MPI_Info_set(info, "host", "node2"); 
MPI_Comm intercom; 
MPI_Comm_spawn("worker", 
     MPI_ARGV_NULL, 
     nprocs, 
     info, 
     0, 
     MPI_COMM_SELF, 
     &intercom, 
     MPI_ERRCODES_IGNORE); 

을하지만이 오류 메시지와 함께 실패합니다

 
-------------------------------------------------------------------------- 
There are no allocated resources for the application 
    worker 
that match the requested mapping: 


Verify that you have mapped the allocated resources properly using the 
--host or --hostfile specification. 
-------------------------------------------------------------------------- 
-------------------------------------------------------------------------- 
A daemon (pid unknown) died unexpectedly on signal 1 while attempting to 
launch so we are aborting. 

There may be more information reported by the environment (see above). 

This may be because the daemon was unable to find all the needed shared 
libraries on the remote node. You may set your LD_LIBRARY_PATH to have the 
location of the shared libraries on the remote nodes and this will 
automatically be forwarded to the remote nodes. 
-------------------------------------------------------------------------- 

나는의 이름으로 "노드 2"를 교체하는 경우 내 로컬 컴퓨터, 그럼 잘 작동합니다. 내가 node2로 ssh하고 같은 일을 (정보 사전에 "node2"와 함께) 실행하면 잘 작동합니다.

mpirun을 사용하여 상위 프로세스를 시작하고 싶지 않으므로 원격 노드의 프로세스를 동적으로 생성하는 방법을 찾고 있습니다. 이것이 가능한가?

답변

1

나는 mpirun이와 부모 프로세스를 시작하고 싶지 않아, 그래서 난 그냥 동적으로 원격 노드에 프로세스를 생성 할 수있는 방법을 찾고 있어요. 이 이 가능한가요?

mpirun으로 시작하고 싶지 않은 이유가 확실하지 않습니다. 어쨌든 MPI_Init()에 도달하자마자 MPI 기계 전체를 암시 적으로 시작합니다.이 방법을 사용하면 기본값에 의존하지 않고 옵션을 전달할 수 있습니다.

여기서 문제는 MPI 라이브러리가 시작할 때 (MPI_Init()) --host 또는 --hostfile 옵션을 지정하지 않았기 때문에 사용할 수있는 다른 호스트가 보이지 않는다는 것입니다 mpirun하기. 그것은 단지 다른 곳에서 프로세스를 시작하지 않을 것입니다. (실제로 스폰가 Info 호스트를 필요로하지 않으므로 일반적으로 다른 곳을 알지조차 모릅니다), 실패합니다.

그래서 당신은 mpirun --host myhost,host2 -np 1 ./parentjob 또는보다 일반적으로, 바람직하게는

myhost slots=1 
host2 slots=8 
host3 slots=8 

사용 가능한 슬롯의 수와 hostfile을 제공하고 작업이 방법을 시작, mpirun --hostfile mpihosts.txt -np 1 ./parentjob이이 기능입니다을 수행해야합니다, 벌레가 아닙니다. 이제 MPI는 작업자의 위치를 ​​파악하고 정보에 명시 적으로 호스트를 지정하지 않으면 가장 활용도가 낮은 장소에 호스트를 배치하려고 시도합니다. 또한 생성하려는 호스트를 변경하기 위해 다시 컴파일 할 필요가 없음을 의미합니다.

+0

감사합니다. mpirun을 피하고 싶은 이유는 계산의 부하를 줄이는 MATLAB mex 파일을 작성하고 있기 때문입니다. 그래서 저는 MATLAB이 호출하는 하나의 C 파일을 가지고 있습니다. 즉, 호스트 이름을 프로그래밍 방식으로 지정해야한다는 의미입니다. 이것은 mex 파일에서 mpirun을 새로운 프로세스로 호출해야한다는 것을 의미한다고 생각하십니까? – krashalot

+0

아, 그래. 그것이 가능하다면 mex 파일 호출 시스템 ("mpirun ..")을 항상 가질 수 있으며 mpirun을 호출하는 bash 스크립트를 호출 할 수도 있습니다 ...이 다중 계층을 피하기 원하는 위치를 알 수 있습니다. 방금 시도한 또 다른 것은 OpenMPI에서 작동하는 것처럼 보입니다. 그렇지만 너무 끔찍해서 내 이름을 SO와 관련되게 부끄럽게 여긴다는 것은 다음과 같습니다 :'int fakeargc = 6; char ** fakeargv = { "mpirun", "--hostfile", "mpihosts.txt", "- np", "1", "./ parentjob"}; MPI_Init (& fakeargc, & fakeargv);'. 나는 그것이 권장되거나 다른 MPI와도 안정적으로 작동 할 것이라고 상상할 수 없다. –

+0

오 잘. 여분의 레이어가 필요한 것 같습니다. 너의 속임수는 나에게 받아 들여 졌을거야.하지만 안타깝게도 여기서 일하지 않았다. (그런데 char * fakeargv []로 정의하고 char ***로 캐스팅해야했다.) 나는 openmpi와 mpich2 문서를 좀 더 파고 들었고, mpirun/mpiexec을 통해 호출하지 않는 한 원격 노트에 대한 스폰 프로세스를 지원하지 않는 시점이 생겼습니다. – krashalot