Ao escrever código MPI 3.0, que deve passar argc
e argv
à MPI_Init
chamada ou não, e por quê?
EDIT: Como a resposta de Bill Barth levantou algumas perguntas, quero fazer algumas observações:
- A aprovação
argc
/argv
não é necessária desde o MPI 1.1. - A pergunta é especificamente sobre por que deveria / não se deve passar
argc
/argv
( por que você não deveria então não é realmente uma resposta). - Ainda assim, às vezes você não pode passar
argc
/argv
paraMPI_Init
(escrever uma biblioteca que usa inicialização estática para iniciar o MPI se main estiver fora do seu controle e o MPI for um detalhe de implementação).
EDIT2: A pergunta por que você não usariaMPI_Init(argc, argv)
chegou com muita frequência agora. Algumas razões:
Não é possível fazê-lo por uma questão de compatibilidade com implementações MPI <1.1 mais antigas / não compatíveis / compatíveis, pois se você estiver usando recursos MPI2 ou MPI3, eles não funcionarão de maneira alguma.
MPI_Init()
inicializa o tempo de execução MPI da mesma maneira queMPI_Init(argc, argv)
MPI_Init(argc, argv)
remove argumentos passados para a MPI tempo de execução deargc
eargv
e inicializa MPI. AFAIK é a única maneira de limparargc
eargv
, se você precisar que eles não tenham argumentos MPI, precisará usá-lo.MPI_Init()
pode ser usado em mais situações queMPI_Init(argc, argv)
. Por exemplo, sua biblioteca que usa o MPI como um detalhe de implementação pode testar se o MPI foi inicializado e, se não, a chamadaMPI_Init()
e a coisa certa acontecerão. O seu usuário não sabe que você está usando MPI, não precisa passarargc
,argv
para a sua biblioteca, não precisa mudar seu principal (no caso de ser tomada sem argumentos) para usar sua biblioteca ....
MPI_Init()
que precisa obter corretamente os argumentos aos quais você passampirun
/ dempiexec
alguma forma (não é especificado como), e comoMPI_Init()
pode ser usada em mais situações do queMPI_Init(argc, argv)
(e sem soluções alternativas), eu não ' Realmente não adianta usarMPI_Init(argc, argv)
se você estiver segmentando o MPI 3.0.argc
e aargv
partir dos argumentos MPI e inicializar o MPI, use-oMPI_Init(argc, argv)
; caso contrário, tudoMPI_Init()
bem (e às vezes é necessário).Respostas:
Definitivamente, eu os passaria, mas passaria os ponteiros como este MPI_init (& argc, & argv), permitindo uma chamada perfeitamente válida MPI_init (NULL, NULL) em sua função.
fonte
Não sei se há algo novo no padrão 3.0 que torna opcional no C / C ++ não passá-los, mas eu definitivamente os passaria. Não sei o estado atual, mas no passado muitas implementações transmitiram argumentos adicionais da linha de comando para o seu programa quando executados e, em seguida, os editaram
MPI_Init()
. Se você deseja usar argumentos de linha de comando para passar opções ao seu programa, se você não permitir que a implementação faça sua edição, será necessário interpretar seus argumentos e um número e estilo de argumentos potencialmente desconhecidos da implementação específica você está usando. Também é altamente provável que esses argumentos variem de implementação para implementação.É bastante normal para chamar
MPI_Init()
comargc
eargv
, por isso, por que não você?fonte
mpirun
/mpiexec
com alguns parâmetros,mpirun
poderá definir algumas variáveis de ambiente antes de iniciar o meu programa e depois ler as de dentroMPI_Init
. (2) Não testei todas as implementações possíveis, mas como a pergunta indica, estou interessado apenas em implementações em conformidade com MPI 3.0. Não há muitos que são misteriosos .