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 nosso cluster dispõe do Intel MPI (recomendado) e o OpenMPI.

Observação: é 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.

// required MPI include file
#include "mpi.h"
#include <stdio.h>

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:

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

#!/bin/bash
#SBATCH -n 16

module load intel/compilers
module load intel/mpi
srun -n 16 ./mpi_hello