"O MPI (Message Passing Interface) são conjuntos de processos que possuem acesso à memória local. Essas informações são enviadas para a memória local do processo remoto."
Conceito:
Processo: "Quando o programa é executado, ele é 'quebrado em partes', cada parte deste programa é chamado de PROCESSO. Estes processos podem ser executados em UMA ÚNICA máquina ou em VÁRIAS."
Rank: "Cada processo tem uma identificação única atribuída pelo sistema quando o processo é inicializado. Essa identificação é contínua representada por um número inteiro, começando de zero até N-1, onde N é o número de processos. Cada processo tem um rank, é ele é utilizado para enviar e receber mensagens."
Funcionamento:
"Os processos são divididos em pequenas partes e essas partes são distribuídas para que outras máquinas do (Nó/Cluster) façam o cálculo em cimas dessas partes. Os resultados obtidos das outras máquinas são enviados a uma receptora que fez a chamada."
Fontes (modificadas):
Instalação e configuração de dependências
Os testes foram feitos em máquinas virtuais, utilizei o VmWare Player para executá-las.
O ideal para saber como realmente trabalha uma aplicação distribuída, é criar ao menos 2 máquinas. Eu, particularmente, utilizei a seguinte configuração para ambos os hosts.
- SO = Linux Debian 5.0.4 Lenny
- Hard Disk-2 GB
- Memória RAM = 128 MB
Após ter as 2 máquinas virtuais, na mesma rede. Testar com o comando:
ping ip_da_outra_maq
Seguir com os próximos passos.
Obs.:
- Os comandos podem variar de distribuição para distribuição.
- Os comandos abaixo foram feitos em um Debian 5.0.4 GNU/Linux.
- Sempre tenha atenção com que máquina é utilizado o comando `debianompi1 = Máquina 1, debianopmi2 = Máquina 2`.
- O MESMO PROCEDIMENTO TEM QUE SER FEITO EM TODAS AS MÁQUINAS!!!
1. Criar os mesmos usuários para todos os hosts (como root):
# adduser ompi2
# adduser ompi1
2. Fazer o download do OpenMPI disponível no próprio site:
# wget http://www.open-mpi.org/software/ompi/v1.4/downloads/openmpi-1.4.3.tar.gz
3. Desempacotando o pacote:
# tar -xvzf openmpi-1.4.3.tar.gz
4. É necessário instalar outras dependências do Open MPI, assim como o ssh (responsável pela comunicação remota com os demais hosts), o gcc e o g++ (responsáveis por compilar os programas em Fortran para linguagem C):
# apt-get install openmpi-bin openmpi-doc libopenmpi-dev gcc g++openssh-server sysstat
Obs.: Sugestão para sources.list pode ser encontrado nesta dica:
Repositórios oficiais Debian
5. Configuração SSH
Para o programa distribuir seu processamento, é necessário que a comunicação entre os demais hosts seja de forma automática, ou seja, não pode exigir senha. Para isto foi gerado um par de chaves com uma frase secreta "em branco" e este copiado para os demais hosts. Quando for feito uma conexão ssh, uma senha "vazia" será aceita e haverá comunicação.
ssh-keygen -t rsa
$ ssh-keygen -t rsa
6. Após ter gerado o par de chaves, abaixo estaremos instalando a chave pública no outro host, permitindo que ela seja usada para autenticação:
ssh-copy-id -i ~/.ssh/id_rsa.pub ompi1@IP.DA.MAQ2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub ompi2@IP.DA.MAQ1
# /etc/init.d/ssh restart
7. Configuração OpenMPI
Para os comandos OMPI serem reconhecidos pelo SO, é necessário adicionar o caminho dos binários dos comandos do OpenMPI à variável de ambiente $PATH.
echo 'export PATH=$PATH:/opt/openmpi/bin' >> /home/ompi1/.bashrc
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:/opt/openmpi/bin
* Fazer logout e logon
Verificar se o comando é reconhecido:
mpirun
Caso contrário verificar novamente a variável de ambiente path:
echo $PATH
8. Para distribuir o processamento da execução de um programa, é necessário criar um arquivo que chamei de "my_target" com o endereço IP dos hosts que irá receber este processamento.
echo IP.DA.MAQ1 > my_target;echo IP.DA.MAQ2 >> my_target