.. _memoria_distribuida: Memória Distribuída =================== No modelo de paralelização com memória distribuída, serão criados vários processos para a execução paralela, mas ao contrátio do modelo de memória compartilhada, esses processos estarão em servidores (computadores) distintos. Dessa forma, é possível usar o recurso computacional de mais de um servidor ao mesmo tempo. Como cada processo só enxerga diretamente a memória do computador em que ele está executando, esse modelo é chamado de memória distribuída. As informações entre os processo são feitas através de troca de mensagens. Para funcionar dessa forma, o programa tem que ser expicitamente desenvolvido com essa capacidade. Geralmente isso é feito usando uma biblioteca `MPI `_. Existem algumas implementações desse padrão, sendo que o cluster do GridUnesp dispõe do *Intel MPI* (recomendado) e do *OpenMPI*. .. note:: É possível combinar paralelização por memória compartilhada e memória distribuída simultaneamente. Compilando ---------- Vamos usar como exemplo o arquivo *mpi_hello.c* abaixo. .. code-block:: c++ // required MPI include file #include "mpi.h" #include Int main(int argc, char *argv[]) { int numtasks, rank, len, rc; char hostname[MPI_MAX_PROCESSOR_NAME]; // initialize MPI MPI_Init(&argc,&argv); // get number of tasks MPI_Comm_size(MPI_COMM_WORLD,&numtasks); // get my rank MPI_Comm_rank(MPI_COMM_WORLD,&rank); // this one is obvious MPI_Get_processor_name(hostname, &len); printf ("Number of tasks= %d My rank= %d Running on %s\n", numtasks,rank,hostname); // done with MPI MPI_Finalize(); } Para compilar, basta executar os comandos: .. code-block:: bash module load intel/compilers module load intel/mpi mpiicc mpi_hello.c -o mpi_hello Script de execução ------------------ No *Slurm* é possível especificar o número de processos (tasks) que se deseja alocar. Isso é feito com a opção ``-n``. Mais de um processo pode ser alocado no mesmo servidor. Para um controle mais preciso, utilize ``-N`` (não recomendado) para escolher em quantos nós deseja espalhar os processos. .. code-block:: bash #!/bin/bash #SBATCH -n 16 module load intel/compilers module load intel/mpi srun -n 16 ./mpi_hello A seção :ref:`aplicacoes_instaladas` apresenta vários exemplos de scripts de submissão usando aplicações já instaladas no cluster e preparados para processar com memória distribuída.