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 ....


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.


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ê?


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.