Devo passar argumentos de linha de comando para MPI_Init ou não?

8

Ao escrever código MPI 3.0, que deve passar argce argvà MPI_Initchamada 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/ argvnã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/ argvpara MPI_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 que MPI_Init(argc, argv)

  • MPI_Init(argc, argv)remove argumentos passados para a MPI tempo de execução de argce argv e inicializa MPI. AFAIK é a única maneira de limpar argce argv, se você precisar que eles não tenham argumentos MPI, precisará usá-lo.

  • MPI_Init()pode ser usado em mais situações que MPI_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 chamada MPI_Init()e a coisa certa acontecerão. O seu usuário não sabe que você está usando MPI, não precisa passar argc, argvpara a sua biblioteca, não precisa mudar seu principal (no caso de ser tomada sem argumentos) para usar sua biblioteca ....

gnzlbg
fonte
Não entendo por que a resposta da BillBarth não responde à sua pergunta. A parte "por que você não" parece resumir a essência de sua resposta, que descreve o que aconteceu com implementações MPI anteriores e por que não passar argumentos pode causar problemas. Talvez você esteja procurando algo mais definitivo?
Geoff Oxberry
@ GeoffOxberry O problema com o porquê você não responde é que ele é tão bom quanto o por que você responde. Como todas as implementações de MPI que suportam MPI> 1.1 precisam oferecer a alternativa MPI_Init()que precisa obter corretamente os argumentos aos quais você passa mpirun/ de mpiexec alguma forma (não é especificado como), e como MPI_Init()pode ser usada em mais situações do que MPI_Init(argc, argv)(e sem soluções alternativas), eu não ' Realmente não adianta usar MPI_Init(argc, argv)se você estiver segmentando o MPI 3.0.
gnzlbg
A compatibilidade com implementações MPI compatíveis com MPI <1.1 não é possível de qualquer maneira, se você precisar usar os recursos MPI 2.0 ou MPI 3.0.
precisa saber é o seguinte
2
Você ainda está sentindo falta do meu ponto básico. A distribuição MPI não pode dizer em tempo de execução se o seu MPI_Init passa NULLs ou não, então provavelmente coloca coisas na linha de comando. Se você não passar o argc e o argv, o MPI_Init não poderá editá-los para remover suas adições; portanto, seu código precisará ser robusto para argumentos espúrios da linha de comando do MPI. Portanto, por que correr o risco de ter que lidar com um conjunto de argumentos arbitrário e talvez conflitante quando você pode transmiti-los ao MPI_Init e recuperar um conjunto limpo? Se você não pode, não pode, mas deveria .
Bill Barth
Veja a segunda edição da pergunta. Basicamente, se você deseja limpar argce a argvpartir dos argumentos MPI e inicializar o MPI, use-o MPI_Init(argc, argv); caso contrário, tudo MPI_Init()bem (e às vezes é necessário).
gnzlbg

Respostas:

2

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.

ruibarbo
fonte
1

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()com argce argv, por isso, por que não você?

Bill Barth
fonte
A especificação diz que, após o MPI 1.1, se você passar nulo para MPI_Init, ele deverá ler os argumentos do ambiente. Então, por que passá-los para o seu aplicativo em primeiro lugar, se ele pode lê-los no ambiente? Se os tempos de execução passarem os argumentos para o aplicativo de qualquer maneira, sim, faz sentido chamar MPI_Init com eles para que pelo menos o tempo de execução os limpe antes que o restante do aplicativo os use.
gnzlbg
OK, você já testou todas as pilhas disponíveis para descobrir se elas alcançaram o que podem fazer? Se é possível que alguma pilha estrague a análise do argumento do seu código adicionando argumentos extras, por que não fazer sua parte para remover esses argumentos extras durante a inicialização? Qual é o mal em passar argc e argv para MPI_Init ()? Novamente, por que não fazer isso?
Bill Barth
1
(1) Realmente não entendo seu ponto de vista sobre as informações do ambiente. Se eu chamar mpirun/ mpiexeccom alguns parâmetros, mpirunpoderá definir algumas variáveis ​​de ambiente antes de iniciar o meu programa e depois ler as de dentro MPI_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 .
gnzlbg
2
Perdi sua edição antes de digitar tudo isso. Minha sugestão é passar argc e argv para a biblioteca se ela deseja inicializar o MPI em seu nome. Isso ou exige que os usuários MPI_Init () e passem a biblioteca para o comunicador necessário. É possivelmente não portável não chamar MPI_Init () com argc e argv. O Petsc, por exemplo, suporta os dois estilos.
Bill Barth
1
O suporte a ambos os estilos parece necessário para quem escreve um wrapper MPI.
gnzlbg