2014-10-13 2 views
0

mpirun (및 mpiexec)이 내 C 코드에 명령 줄 인수를 전달하지 않는 것처럼 보입니다.mpirun이 명령 줄 인수를 전달하지 않음

명령 줄에서 직접 내 exeutable "도마뱀"을 실행 예상 제공합니다

$ ./gecko -np 2 

main:There are 3 arguments: 
arg=./gecko 
arg=-np 
arg=2 

그러나에 mpirun을 통해 같은 실행이 다른 :

$ mpirun -np 2 ./gecko 

main:There are 1 arguments: 
arg=./gecko 

MPI_init 의미 (는 argc를, ARGV) 아무튼 함께 일할 인수가 없습니다. 우분투 12.04와 MPICH 2를 함께 사용 중입니다.

왜 이런 일이 일어나지 않는지 알 수 있습니까?

감사합니다.

--------------------------- EDIT ------------------ ---------------

MPI를 초기화 할 수있는 방법은 명령 행 인수를 통해이라고 그물에 많은 예, 예 : : 있습니다

#include <stdio.h> 
#include “mpi.h”         
int main(int argc, char* argv[]) 
{ 
int size, rank; 
MPI_Init(&argc, &argv);      
MPI_Comm_size(MPI_COMM_WORLD, &size);   
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
printf(“Greetings from process %i\n”, rank); 
MPI_Finalize();         
return 0; 
} 

와 MPI 코드를 실행할 수있는 방법이라고 사용하는 : mpirun이는 C 코드에 인수 NP와 2 단계를 통과하지 못할 경우

mpirun -np 2 ./code_name 

그래서, 어떻게 C 코드 이제까지 KN에 도착 않습니다 얼마나 많은 프로세서를 실행해야합니까?

+0

글쎄, 적어도이 일치한다. OpenMPI를 사용하면 일부 프로세스가 인수를 받고 나머지 부분은 수신하지 못하게됩니다 (포트란에서). –

+1

''gecko '에'-np 2'를 전달하려면'mpirun -np 2 ./gecko -np 2'를 사용해야합니다. –

+0

MPI-1은'argc'와'argv'가'MPI_Init'에 전달되어야한다고 요구했습니다. MPI-2는 그 요구 사항을 제거했습니다. 대부분의 예제는 전적으로 역사적인 이유로'MPI_Init (& argc, & argv)를 사용합니다. –

답변

1

이후 둘 다 인수가 NULL 인 경우 MPI_Init()도 작동합니다. 이것은 실질적으로 모든 MPI 구현이 다른 메커니즘을 사용하여 구성 정보, 즉 환경 변수와 파일을 전달한다는 것을 의미합니다. 예를 들어 Open MPI는 다음 변수를 전달합니다.

$ cat print_ompi_vars 
#!/bin/bash 
printenv | grep ^OMPI | sort 
$ mpiexec -np 1 ./print_ompi_vars 
OMPI_COMM_WORLD_LOCAL_RANK=0 
OMPI_COMM_WORLD_LOCAL_SIZE=1 
OMPI_COMM_WORLD_NODE_RANK=0 
OMPI_COMM_WORLD_RANK=0 
OMPI_COMM_WORLD_SIZE=1 
OMPI_MCA_btl=^tcp 
OMPI_MCA_btl_openib_ib_timeout=24 
OMPI_MCA_btl_openib_warn_default_gid_prefix=0 
OMPI_MCA_btl_tcp_if_include=ib0 
OMPI_MCA_carto=file 
OMPI_MCA_carto_file_path=/opt/MPI/openmpi/carto/carto_2K-64C.txt 
OMPI_MCA_ess=env 
OMPI_MCA_mpi_yield_when_idle=0 
OMPI_MCA_oob_tcp_if_include=ib0 
OMPI_MCA_orte_app_num=0 
OMPI_MCA_orte_cpu_model=Intel(R) Xeon(R) CPU   X5675 @ 3.07GHz 
OMPI_MCA_orte_cpu_type=GenuineIntel 
OMPI_MCA_orte_daemonize=1 
OMPI_MCA_orte_ess_jobid=4114219009 
OMPI_MCA_orte_ess_node_rank=0 
OMPI_MCA_orte_ess_num_procs=1 
OMPI_MCA_orte_ess_vpid=0 
OMPI_MCA_orte_hnp_uri=4114219008.0;tcp://1.2.3.4:48206 
OMPI_MCA_orte_local_daemon_uri=4114219008.1;tcp://1.2.3.4:59277 
OMPI_MCA_orte_num_nodes=1 
OMPI_MCA_orte_num_restarts=0 
OMPI_MCA_orte_precondition_transports=1f4c3cf87403b137-a8e3173542efb9c3 
OMPI_MCA_plm=rsh 
OMPI_MCA_shmem_RUNTIME_QUERY_hint=mmap 
OMPI_UNIVERSE_SIZE=1 

다른 MPI 구현과 마찬가지로 작동합니다.

어쨌든, 당신이 당신의 MPI 실행에 인수를 전달하는 실행 파일의 이름 뒤에 평소와 같이 넣어하고자하는 경우 :

$ mpiexec -n 16 <other mpiexec args> ./gecko -np 2 <other program args> 
+0

OMPI가 호출 될 때 이러한 변수가 Windows에도 있습니까? 아마도 – frankliuao

+0

. 필자는 Windows에서 Open MPI를 사용하지 않았으며 더 이상 지원되지 않지만 대부분의 코드는 플랫폼 독립적이며 동일한 변수가 Windows에서도 사용된다고 가정하는 것이 합리적 일 수 있습니다. –

+0

그래, 나도 그렇게 생각할거야. Windows는 아주 이상합니다. 나를위한 OS는 아니지만 Windows 사용자의 가능성을 고려해야합니다 ... – frankliuao

5

-np 인수는 실행 파일에 의해 해석되는 것이 아니라 mpirun에 의해 해석되어야합니다. 실행 파일에 추가 인수를 전달하려면 평소와 같이 실행 파일 이름 뒤에 나열해야합니다.

MPI 작업 수가 필요한 경우 해당 번호를 제공하는 적절한 MPI 기능을 사용해야합니다.

편집 :

MPI 수도 MPI_Init이나 구현을 만족시키는 임의의 다른 수단에 의해 소정의 인수를 통해 패스 시작 정보. 사용하는 MPI 구현에 따라 MPI가 프로그램에 더 많은 인수를 전달할 수 있습니다. 그러면 MPI_Init은 필요한 모든 항목을 추출하고 이해하지 못하는 항목 만 남깁니다.

응용 프로그램에서 이러한 인수 전달 규칙에 의존해서는 안됩니다. MPI는 이식성이 있어야하며 MPI 함수를 사용하여 런타임 매개 변수에 액세스해야합니다.

+0

다음은 이해할 수없는 내용입니다. 명령 행에서 프로세서 수를 초기화하는 데 사용되는'MPI_Init (& argv, & argc)'예제가 많이 있습니다. 제 이해는 mpirun에 여러 프로세서를 제공했다는 것입니다 (-np 2를 통해). 이것은 MPI_init에 전달되었습니다. MPI_Init()는'-np 2'가 전달되지 않으면 어떻게 프로세서의 수를 알 수 있습니까? 즉, 2 개의 프로세서에서 내 작업을 시작하는 올바른 구문은 무엇입니까? – kotozna

+0

@kotozna,'mpirun' (또는'mpiexec')은 일반적으로 요청 된만큼의 MPI 프로세스를 초기에 실행하는 프로그램의 이름입니다. 또한'MPI_Init()'호출 중에 이들 프로세스가 서로를 찾는데 필요한 정보를 전달합니다. 'MPI_Init()'는 새로운 프로세스를 시작하지 않습니다. –

관련 문제