.. _memoria_compartilhada: 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 à 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. .. code-block:: c++ /****************************************************************************** * 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 #include #include 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: .. code-block:: bash 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é 56 cores por processo nos servidores do GridUnesp. A seguir temos um modelo de script para submissão de jobs com base no exemplo acima. .. code-block:: bash #!/bin/bash #SBATCH -c 8 module load intel/compilers ./omp_hello A seção :ref:`aplicacoes_instaladas` apresenta vários exemplos de scripts de submissão preparados usando aplicações já instaladas no cluster e preparados para processar com memória compartilhada.