===== Tutorial: Hello, world em MPI (exemplo da Intel) ===== Este texto é uma adaptação, para a configuração da gina, do tutorial da Intel, no capítulo 4 de ''/apps/mpi/ICTCE_Linux_Tutorial.pdf'' [[http://www.astro.iag.usp.br/~gina/tut/ICTCE_Linux_Tutorial.pdf]] [[http://www.astro.iag.usp.br/~gina/docs/ictc/doc/Linux_Getting_Started.htm]] Para testar a sua configuração MPI, este exemplo inicia múltiplos processos (nos dois nós, inclusive), apenas imprimindo um //Hello, world// identificando de que nó cada linha vem. ==== Configuração do MPI ==== Primeiramente, é necessário criar os arquivos que definem em que hosts o MPI vai iniciar os processos, e criar os arquivos de chaves públicas SSH para que as conexões sejam feitas pelo MPI sem precisar de senhas: Copie o arquivo ''machines.LINUX'', que especifica os hosts, de ''/apps/mpi/machines.LINUX''. Este contém apenas gina gina-n2 Que especifica cada nó em uma linha (o master é sempre a primeira linha). A forma mais simples de criar e compartilhar as chaves públicas para SSH para a conexão entre os nós é usar este arquivo com o script ''sshconnectivity.exp'', fornecido pela Intel (e incluído no PATH). Supondo que o ''machines.LINUX'' foi colocado no ''$HOME'' do usuário: sshconnectivity.exp ~/machines.LINUX Ele vai pedir a senha do usuário, e conectar a cada host para compartilhar a chave pública, de forma que conexões SSH entre estes hosts não vão precisar da senha. O daemon mpd, que executa os processos, precisa de dois arquivos de configuração, que podem ser copiados de ''/apps/mpi/''. ''mpd.hosts'': gina gina-n2 ifhn=gina-n2-ib Que especifica os hosts a usar e (opcionalmente) a interface para conexão. E ''.mpd.conf'', que especifica uma senha para uso do mpd (é uma senha apenas para o mpd, e que fica visível neste arquivo de texto: **não** use uma senha em comum com qualquer outra, em particular a sua senha de login): secretword= Com isso, há tudo que é necessário para rodar um programa com o MPI da Intel. ==== Compilação com MPI ==== O programa a ser compilado e executado aqui é um dos exemplos //Hello, world// de ''/apps/intel/impi/4.0.0.028/test/''. Copie algum deles, e o compile com o compilador MPI da Intel. Para o exemplo em C++: mpiicpc test.cpp -o testcpp ==== Execução com MPI ==== Os processos em MPI são executados pelo daemon mpd. Este pode ser iniciado diretamente, para uso pelo ''mpiexec'', ou pode ser iniciado pelo próprio ''mpirun'', que também executa o programa em MPI: === mpiexec === Primeiro, o daemon deve ser iniciado, especificando-se que hosts vão ser usados: mpdboot -n 2 -r ssh -f ~/mpd.hosts Inicia o mpd em 2 nós (''-n''), para comunicação por ssh (''-r'') e usando os nós listados no ''mpd.hosts'' dado (''-f''). Pode se verificar que o daemon está rodando com o comando ''mpdtrace'', que mostra a lista de hosts que o daemon está usando: penteado@gina:~> mpdtrace gina gina-n2 Agora o programa pode ser iniciado com o mpiexec, especificando quantos processos vão ser lançados (''-n''), e o executável: penteado@gina:~>mpiexec -n 30 /home/penteado/test_intel_mpi/testcpp Hello world: rank 0 of 30 running on gina Hello world: rank 1 of 30 running on gina Hello world: rank 2 of 30 running on gina Hello world: rank 3 of 30 running on gina Hello world: rank 4 of 30 running on gina Hello world: rank 5 of 30 running on gina Hello world: rank 6 of 30 running on gina Hello world: rank 7 of 30 running on gina Hello world: rank 8 of 30 running on gina Hello world: rank 9 of 30 running on gina Hello world: rank 10 of 30 running on gina Hello world: rank 11 of 30 running on gina Hello world: rank 12 of 30 running on gina-n2 Hello world: rank 13 of 30 running on gina-n2 Hello world: rank 14 of 30 running on gina-n2 Hello world: rank 15 of 30 running on gina-n2 Hello world: rank 16 of 30 running on gina-n2 Hello world: rank 17 of 30 running on gina-n2 Hello world: rank 18 of 30 running on gina-n2 Hello world: rank 19 of 30 running on gina-n2 Hello world: rank 20 of 30 running on gina-n2 Hello world: rank 21 of 30 running on gina-n2 Hello world: rank 22 of 30 running on gina-n2 Hello world: rank 23 of 30 running on gina-n2 Hello world: rank 24 of 30 running on gina Hello world: rank 25 of 30 running on gina Hello world: rank 26 of 30 running on gina Hello world: rank 27 of 30 running on gina Hello world: rank 28 of 30 running on gina Hello world: rank 29 of 30 running on gina Note que cada nó tem 2 processadores de 6 núcleos cada, que podem ou não estar com [[wp>Hyperthreading]] habilitado. Portanto cada nó tem 12 núcleos físicos, mas com HT pode executar 24 processos simultâneos (o sistema o vê como 24 núcleos). Atualmente estão sendo feitos testes para determinar se é melhor deixar o HT habilitado ou não. Pode-se verificar a situação atual com o comando ''cpuinfo'', que mostra quantos núcleos o sistema parece ter. O daemon continua rodando, e pode ser encerrado com ''mpdallexit'': penteado@gina:~> mpdtrace gina gina-n2 penteado@gina:~> mpdallexit penteado@gina:~> mpdtrace mpdtrace: cannot connect to local mpd (/tmp/mpd2.console_penteado); possible causes: 1. no mpd is running on this host 2. an mpd is running but was started without a "console" (-n option) === mpirun === No lugar do mpiexec, pode ser usado o mpirun, que inicia o mpd, executa o programa em MPI, e termina o mpd ao final, com uma única linha de comando: penteado@gina:~> mpirun -r ssh -f ~/mpd.hosts -n 30 -env I_MPI_FABRICS shm:tcp /home/penteado/test_intel_mpi/testcpp Hello world: rank 0 of 30 running on gina Hello world: rank 1 of 30 running on gina Hello world: rank 2 of 30 running on gina Hello world: rank 3 of 30 running on gina Hello world: rank 4 of 30 running on gina Hello world: rank 5 of 30 running on gina Hello world: rank 6 of 30 running on gina Hello world: rank 7 of 30 running on gina Hello world: rank 8 of 30 running on gina Hello world: rank 9 of 30 running on gina Hello world: rank 10 of 30 running on gina Hello world: rank 11 of 30 running on gina Hello world: rank 12 of 30 running on gina-n2 Hello world: rank 13 of 30 running on gina-n2 Hello world: rank 14 of 30 running on gina-n2 Hello world: rank 15 of 30 running on gina-n2 Hello world: rank 16 of 30 running on gina-n2 Hello world: rank 17 of 30 running on gina-n2 Hello world: rank 18 of 30 running on gina-n2 Hello world: rank 19 of 30 running on gina-n2 Hello world: rank 20 of 30 running on gina-n2 Hello world: rank 21 of 30 running on gina-n2 Hello world: rank 22 of 30 running on gina-n2 Hello world: rank 23 of 30 running on gina-n2 Hello world: rank 24 of 30 running on gina Hello world: rank 25 of 30 running on gina Hello world: rank 26 of 30 running on gina Hello world: rank 27 of 30 running on gina Hello world: rank 28 of 30 running on gina Hello world: rank 29 of 30 running on gina Onde as opções ''-r'' e ''-f'' são encaminhadas ao ''mpdboot'', e as outras vão para o ''mpiexec''. A opção ''-env'' está especificando uma variável de ambiente determinando o uso de memória compartilhada para comunição intra-nó, e tcp para comunicação entre-nós. ===== Referências ===== === Intel® Cluster Toolkit Compiler Edition 4.0 for Linux* OS === ''/apps/intel/ictce/4.0.0.020/doc/Doc_Index.htm'' [[http://www.astro.iag.usp.br/~gina/docs/ictc/doc/Doc_Index.htm]] === Intel® MPI Library for Linux* OS === ''/apps/intel/ictce/4.0.0.020/mpi/doc/Reference_Manual.pdf'' [[http://www.astro.iag.usp.br/~gina/docs/ictc/mpi/doc/Reference_Manual.pdf]] === Intel® Cluster Toolkit Compiler Edition Getting Started Guide === ''/apps/mpi/ICTCE_Linux_Tutorial.pdf'' [[http://www.astro.iag.usp.br/~gina/tut/ICTCE_Linux_Tutorial.pdf]] [[http://www.astro.iag.usp.br/~gina/docs/ictc/doc/Linux_Getting_Started.htm]]