2014-10-13 4 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) Безразлично У меня нет аргументов для работы. Я на Ubuntu 12.04 с MPICH 2.

Может ли кто-нибудь увидеть причину, почему этого не происходит?

Спасибо.

--------------------------- РЕДАКТИРОВАТЬ ------------------ ---------------

есть много примеров в сети, которые говорят, что путь для инициализации 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; 
} 

и что способ выполнения кода МПИ является использование:

mpirun -np 2 ./code_name 

Так что, если mpirun не проходят аргументы нп и 2 в с-кодом, как же с кодом когда-нибудь кп Сколько процессоров должно быть запущено?

+0

Ну, по крайней мере, это соответствует. При использовании OpenMPI a некоторые процессы получают аргументы и другую часть, не получая их (в Fortran, хотя). –

+1

Вы должны использовать вместо 'mpirun -np 2. ./gecko -np 2', если вы хотите передать' -np 2' '' gecko'. –

+0

MPI-1 требовал, чтобы 'argc' и' argv' должны были передаваться 'MPI_Init'. MPI-2 устранил это требование. Большинство примеров используют 'MPI_Init (& argc, & argv)' исключительно по историческим причинам. –

ответ

1

С 1997 года MPI_Init() также работает, если оба его аргумента равны NULL. Это означает, что практически все реализации 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

Эти переменные существуют также в Windows при вызове OMPI? – frankliuao

+0

Возможно. Я не использовал Open MPI в Windows и больше не поддерживается, но большая часть кода не зависит от платформы, и, возможно, разумно предположить, что одни и те же переменные используются и для Windows. –

+0

Да, я тоже так думаю. Windows довольно странная. Для меня не ОС, но я должен учитывать возможность пользователей Windows ... – frankliuao

5

Аргумент -np не предназначен для интерпретации вашего исполняемого файла, а mpirun. Если вы хотите передать дополнительные аргументы в свой исполняемый файл, вам придется перечислить их после имени исполняемого файла, как обычно.

Если вам нужно количество задач MPI, вы должны использовать соответствующую функцию MPI, которая предоставляет вам этот номер.

Edit:

MPI может информации запуска проходит через аргументы, переданных MPI_Init или любые другие средствами, которые радуют реализатор. В зависимости от используемой вами реализации MPI вы можете увидеть, что MPI передает гораздо больше аргументов вашей программе. MPI_Init затем разрывает все, что ему нужно, и оставляет только те вещи, которые он не понимает.

Вы не должны полагаться на какой-либо такой аргумент, передающий соглашение в вашем приложении. MPI предназначен для переносимости, и вы должны использовать только функции MPI для доступа к параметрам времени выполнения.

+0

Тогда я этого не понимаю: Есть много примеров использования MPI_Init (& argv, & argc) 'для инициализации числа процессоров из командной строки. Я понял, что вы поставили mpirun с количеством процессоров (через -np 2), и это было передано MPI_init. Как MPI_Init() узнает количество процессоров, если '-np 2' не передается ему? т. е. какой правильный синтаксис для запуска моей работы на двух процессорах? – kotozna

+0

@ kotozna, 'mpirun' (или' mpiexec'), как правило, называется программой, которая выполняет первоначальный запуск как можно большего количества процессов MPI. Он также передает этим процессам информацию, необходимую им, чтобы найти друг друга во время вызова 'MPI_Init(). 'MPI_Init()' не запускает новые процессы. –

Смежные вопросы