16
Programação em Paralelo OpenMP N. Cardoso & P. Bicudo Física Computacional - MEFT 2012/2013 N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 1 / 15

Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

  • Upload
    lamkien

  • View
    222

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Programação em ParaleloOpenMP

N. Cardoso & P. Bicudo

Física Computacional - MEFT2012/2013

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 1 / 15

Page 2: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Introdução

Potencial do GPU vs CPUCálculo: 367 GFLOPS vs. 32 GFLOPSLargura de banda da memória: 86.4 GB/s vs. 8.4 GB/sGPU em todos os PCs e workstations

Paralelização em CPUs

Pthreads

OpenMPMPI

...

Paralelização em GPUs

CUDAOpenCL

...

Nuno Cardoso 1N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 2 / 15

Page 3: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

OpenMP

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 3 / 15

Page 4: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Outline

1 Introdução ao OpenMP

2 Modelo de Programação

3 Directivas C/C++

4 Cláusulas

5 Exemplo: Redução

6 Exemplo: Sections

7 Construtores de Sincronização

8 Funções

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 4 / 15

Page 5: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Introdução ao OpenMP

O que é o OpenMP?do inglês Open Multi-Processing, ou Multi-processamento aberto para CPUs

http://openmp.org/API para programação paralela explícita

standard para programação de sistemas de memória partilhadasobretudo paralelismo nos dados

Constituída por:directivas de compilaçãobibliotecas de funçõesvariáveis de ambiente

Portátilversões para C/C++ e Fortranimplementação para UNIX/Linux e Windows

Objectivo - obter um standard de programação apoiado pelos grandesfabricantes de software e hardware

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 5 / 15

Page 6: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Modelo de Programação do OpenMP

Paralelismo explícitoModelo de memória partilhada

baseado em threadstrabalho é dividido por threads de execuçãovariáveis podem ser

partilhadas por todos os threadsduplicadas (privadas) para cada thread

threads comunicam através das variáveis partilhadas

Usar sincronização para evitar competição entre threadsModelo de execução tipo "fork-join"

inicia execução com um processo (master thread)no início do construtor paralelo→ cria um team-of-threadsao completar→ team-of-threads sincroniza numa barreira implícitaapenas o master continua em execução

Fernando Silva ­ DCC­FCUP 7

OpenMP ­ Modelo de ExecuçãoOpenMP ­ Modelo de Execução Modelo de execução tipo fork­join

inicia execução com um processo (master thread) no início do construtor paralelo – cria um team­of­threads ao completar – o team­of­threads sincroniza numa barreira 

implícita apenas o master continua a execução

Fernando Silva ­ DCC­FCUP 8

C/C++ ­ Estrutura Geral do Código C/C++ ­ Estrutura Geral do Código #include <omp.h>main() { int var1, var2, var3;

parte_sequencial_1();

#pragma omp parallel private(var1,var2) shared(var3){ parte_paralela(); // executada pelos threads ... // Todos os threads fazem o join com o master e terminam} parte_sequencial_2();}

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 6 / 15

Page 7: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Modelo de Programação do OpenMP

controlo destruturaparalelas(directivas

parallel

de s ss)

distribuição de tarefas

(directivas)

forparallel forsection

O

v(c

OPENMP

variáveisclausulas)

sharedprivate

...

sincro(direc

critatobar

.

nizaçãoctivas)

ticalomicrrier...

variáveise de am

omp_set_nuomp_get_nuOMP_NUM

OMP_SC..

s runtime mbiente

m_threads()um_threads()M_THREADSCHEDULE..

O número de threads na região paralela é determinado pelos seguintes factores (ordem deprecedência):

cláusula num_threads(int)função omp_set_num_threads()variável ambiente OMP_NUM_THREADSdefault - depende da implementação

Os threads são numerados de 0 a N − 1

Por defeito, um programa com varias regiões em paralelo usará o mesmo número dethreads para cada região, a menos que seja redefinido

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 7 / 15

Page 8: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

OpenMP: Directivas C/C++

#pragma omp directive-name [clause, ...] newlinedirective-name

uma directiva OpenMP válida. Tem de aparecer depois do pragma e antes dascláusulas

[clause, ...]Opcional. Podem aparecer em qualquer ordem e se necessário repetidas.

newlineObrigatório. Seguido do bloco estruturado que vai ser executado em paralelo.

#include < s t d i o . h>#include <omp. h>

main ( ){

#pragma omp p a r a l l e lp r i n t f ( " He l lo World \ n " ) ;

return 0;}

1 processador

Hello World

4 processadores

Hello WorldHello WorldHello WorldHello World

Compilar em Linux: gcc -o exemplo exemplo.c -fopenmp

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 8 / 15

Page 9: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Cláusulas OpenMP

#pragma omp parallel ’clause’bloco_codigo();As cláusulas possibilitam ao utilizador o controlo do âmbito das variáveis naregião paralela.private(list)

as variáveis da lista ficam privadas a cada thread do teamnão são inicializadas

firstprivate(list)permite que as variáveis privadas sejam inicializadas

shared(list)as variáveis da lista são partilhadas por todos os threadspor defeito as variáveis são "shared"

reduction(operator: list)permite operar sobre as variáveis da lista

copyin(list)possibilita a atribuição do mesmo valor a variáveis THREADPRIVATE

if(exp)tem de avaliar como verdadeiro para que o team de threads seja criado, senão aexecução será sequencial.

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 9 / 15

Page 10: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Exemplo: Redução

#include <omp . h>#include < s t d i o . h>#include < s t d l i b . h>

i n t main ( i n t argc , char ∗argv [ ] ) {i n t i , n , num_threads ;i n t sum = 0;n = 1000;i n t ∗a = ( i n t ∗ ) mal loc ( n∗sizeof ( i n t ) ) ;for ( i =0; i < n ; i ++) a [ i ] = i ;

#pragma omp p a r a l l e lnum_threads= omp_get_num_threads ( ) ;p r i n t f ( " \ nNumero de Threads : %d \ n \ n " , num_threads ) ;

#pragma omp p a r a l l e l forfor ( i =0; i < n ; i ++)

sum += a [ i ] ;p r i n t f ( " Sum = %d \ n " ,sum ) ;

}

Qual é o problema no código?

Vários threads a ler e escrever para sum

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 10 / 15

Page 11: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Exemplo: Redução

#include <omp . h>#include < s t d i o . h>#include < s t d l i b . h>

i n t main ( i n t argc , char ∗argv [ ] ) {i n t i , n , num_threads ;i n t sum = 0;n = 1000;i n t ∗a = ( i n t ∗ ) mal loc ( n∗sizeof ( i n t ) ) ;for ( i =0; i < n ; i ++) a [ i ] = i ;

#pragma omp p a r a l l e lnum_threads= omp_get_num_threads ( ) ;p r i n t f ( " \ nNumero de Threads : %d \ n \ n " , num_threads ) ;

#pragma omp p a r a l l e l forfor ( i =0; i < n ; i ++)

sum += a [ i ] ;p r i n t f ( " Sum = %d \ n " ,sum ) ;

}

Qual é o problema no código?

Vários threads a ler e escrever para sum

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 10 / 15

Page 12: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Exemplo: Redução (Cont.)

Solução 1: reduction(operator: list)

#include <omp . h>#include < s t d i o . h>#include < s t d l i b . h>

i n t main ( i n t argc , char ∗argv [ ] ) {i n t i , n , num_threads ;i n t sum = 0;n = 1000;i n t ∗a = ( i n t ∗ ) mal loc ( n∗sizeof ( i n t ) ) ;for ( i =0; i < n ; i ++) a [ i ] = i ;

#pragma omp p a r a l l e lnum_threads= omp_get_num_threads ( ) ;p r i n t f ( " \ nNumero de Threads : %d \ n \ n " , num_threads ) ;

#pragma omp p a r a l l e l for reduction ( + :sum)for ( i =0; i < n ; i ++)

sum += a [ i ] ;p r i n t f ( " Sum = %d \ n " ,sum ) ;

}

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 11 / 15

Page 13: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Exemplo: Redução (Cont.)

Solução 2: Um array com o tamanho dado pelo número de threads

#include <omp . h>#include < s t d i o . h>#include < s t d l i b . h>

i n t main ( i n t argc , char ∗argv [ ] ) {i n t i , n , num_threads ;i n t sum = 0;n = 1000;i n t ∗a = ( i n t ∗ ) mal loc ( n∗sizeof ( i n t ) ) ;for ( i =0; i < n ; i ++) a [ i ] = i ;

#pragma omp p a r a l l e lnum_threads= omp_get_num_threads ( ) ;p r i n t f ( " \ nNumero de Threads : %d \ n \ n " , num_threads ) ;

i n t ∗asum = ( i n t ∗ ) mal loc ( num_threads∗sizeof ( i n t ) ) ;for ( i =0; i < num_threads ; i ++) asum [ num_threads ] = 0 ;

#pragma omp p a r a l l e l forfor ( i =0; i < n ; i ++)

asum [ omp_get_thread_num ( ) ] += a [ i ] ;

for ( i =0; i < num_threads ; i ++) sum += asum [ i ] ;p r i n t f ( " Sum = %d \ n " ,sum ) ;

}N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 12 / 15

Page 14: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Exemplo: Sections

main ( ) {#pragma omp p a r a l l e l sections{#pragma omp section

Task1 ( ) ;#pragma omp section

Task2 ( ) ;#pragma omp section

Task3 ( ) ;#pragma omp section

Task4 ( ) ;}}

1 processadorexecuta as tasks deforma sequencial

4 processadoresuma task para cadaprocessador

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 13 / 15

Page 15: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Construtores de Sincronização

omp masterespecifica uma região que será executada apenas pelo master (os outros ignoram)

omp criticalespecifica uma região crítica de código que deve ser executada apenas por um threadde cada vez.

omp barrierquando esta directiva é alcançada por um thread, este espera até que os restantescheguem ao mesmo ponto.

omp atomicespecifica um endereço de memória para actualização atómica.

omp flushidentifica um ponto de sincronização no qual é necessário providenciar uma visãoconsistente da memória.

omp orderedespecifica que as iterações devem ser executadas pela mesma ordem, como sefossem executadas sequencialmente.

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 14 / 15

Page 16: Programação em Paralelo - OpenMP - Autenticaçãoµes para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos

Funções OpenMP

void omp_set_num_threads(int)invocada na parte sequencial.

int omp_get_num_threads(void)retorna o número de threads activos

int omp_get_max_threads(void)retorna o número máximo de threads permitidos

int omp_get_thread_num(void)retorna o ID do thread (entre 0 e N − 1)

int omp_get_num_procs(void)retorna o número de processadores disponíveis para o programa

void omp_init_lock(omp_lock_t*)Inicializa um lock associado a variável de lock

void omp_destroy_lock(omp_lock_t*)void omp_set_lock(omp_lock_t*)

espera ate conseguir o lockvoid omp_unset_lock(omp_lock_t*)

liberta o lockdouble omp_get_wtime(void)

retorna o o num. segundos decorridos (elapsed time)double omp_get_wtick(void)

retorna os segundos decorridos entre chamadas sucessivas

N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 15 / 15