Memória compartilhada

Para se aproveitar do paralelismo disponível nos sistemas modernos, os programas podem ser desenvolvidos para utilizar mais de um core (núcleos) simultaneamente. Isso significa que um programa com essa capacidade, sendo executado em um servidor com 8 cores, pode ser executado até 8 vezes mais rápido. Para isso, o programa precisa ser explicitamente programado com essa capacidade, usando bibliotecas ou técnicas específicas.

Como todos os cores utilizados estão sempre no mesmo servidor, e tem acesso a mesma memória, chamamos essa técnica de paralelização de memória compartilhada. Termos relacionados a esse mecanismo são SMP, Threads, OpenMP.

Programas em C/C++ ou Fortran podem ser "facilmente" paralelizados para esse modelo usando OpenMP. Para isso, são necessárias as inclusões de algumas diretivas de compilação (pragmas) no código e a utilização de um compilador compatível.

Compilando

Vamos usar como exemplo o arquivo omp_hello.c abaixo.

/******************************************************************************
* FILE: omp_hello.c
* DESCRIPTION:
*   OpenMP Example - Hello World - C/C++ Version
*   In this simple example, the master thread forks a parallel region.
*   All threads in the team obtain their unique thread number and print it.
*   The master thread only prints the total number of threads.  Two OpenMP
*   library routines are used to obtain the number of threads and each
*   thread's number.
* AUTHOR: Blaise Barney  5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
int nthreads, tid;

/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
  {

  /* Obtain thread number */
  tid = omp_get_thread_num();
  printf("Hello World from thread = %d\n", tid);

  /* Only master thread does this */
  if (tid == 0)
    {
    nthreads = omp_get_num_threads();
    printf("Number of threads = %d\n", nthreads);
    }

  }  /* All threads join master thread and disband */

}

Nesse tipo de compilação recomendamos o compilador da Intel. O cluster também dispõe de uma versão recente do GCC com suporte a OpenMP. Para compilar, basta executar os comandos abaixo:

module load intel/compilers
icc -openmp omp_hello.c -o omp_hello

Script de execução

No SLURM é possível especificar o número de cores que se deseja alocar em cada servidor de processamento (ou task). Isso é feito com a opção -c. Atualmente é possível usar até 8 cores por processo nos servidores do GridUnesp.

A seguir temos um modelo de script para submissão de jobs com base no exemplo acima.

#!/bin/bash
#SBATCH -c 8

module load intel/compilers
./omp_hello