Você está na página 1de 19

OpenMP

TSC 2008

OpenMP
Interface de programao aplicativa (API) para desenvolvimento de aplicaes multithread em:
C/C++ e Fortran

Modelo OpenMP:
Fork/Join

Parallel Region

OpenMP
Define:
Variveis de ambiente Biblioteca de servios Diretivas de compilao

OpenMP: Variveis de Ambiente


Identifica o nmero de atividades que sero executadas em paralelo
OMP_NUM_THREADS (default: nmero de processadores)

Indica se o nmero de atividades a serem executadas em paralelo deve ou no ser ajustado dinamicamente
OMP_DYNAMIC (default: FALSE)

Indica se deve ser contemplado ativao de paralelismo aninhado


OMP_NESTED (default: FALSE)

Define esquema de escalonamento das atividades paralelas


OMP_SCHEDULE (default: esttico)

OpenMP: Servios
Biblioteca de servios
Permitem controlar e interagir com o ambiente de execuo

Exemplos:
omp_set_num_threads() omp_get_num_threads() omp_get_num_procs () omp_get_max_threads() omp_set_nested() omp_get_wtime()

OpenMP: Diretivas
A maioria dos construtores em OpenMP so diretivas do compilador ou pragmas Para C e C++, o pragma possui a seguinte forma: #pragma omp construct [clause [clause]] Pragma Parallel Define uma regio paralelizvel sobre um bloco estruturado de cdigo As threads bloqueiam no fim da regio Os dados so compartilhados (shared) entre as threads ao menos que seja especificado de outra forma

OpenMP: Diretivas
Exemplo (Genrico):
#include <omp.h> main ( ) {
//Cdigo seqencial (master) #pragma omp_parallel { // Cdigo paralelo } // Cdigo seqencial (master)

OpenMP: Diretivas
main () { int nthreads, tid; #pragma omp parallel private(tid) { tid = omp_get_thread_num(); printf("Oi mundo, sou o thread %d\n", tid); if( tid == 0 ) { nthreads = omp_get_num_threads(); printf("Total de threads: %d\n", nthreads); } } }

OpenMP: Diretivas
Diretiva: sections
Cria sees paralelas Cada seo ser executada em um thread diferente main () { int x; #pragma omp sections { #pragma omp section { foo(x); } #pragma omp section { bar(x); } } }

OpenMP: Diretivas
Diretiva: parallel Clusula reduction
Cada execuo pode manipular sua cpia, como em private O valor local inicial definido pela operao de reduo No final uma operao de reduo atualiza o dado no thread master int soma = 100; omp_set_num_threads( 4 ); #pragma omp parallel reduction( + : soma ) { soma += 1; } // No retorno ao master: soma = 104

OpenMP: Diretivas
Diretiva: for / parallel for Permite que os grupos de instrues definidas em um loop sejam paralelizadas Exemplo
float dot_prod(float* a, float* b, int N) { float sum = 0.0; #pragma omp parallel for shared(sum) for(int i=0; i<N; i++) { sum += a[i] * b[i]; } return sum; }

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

. . . .

N-3 N-3 N-2 N-1 N

OpenMP: Diretivas
Diretiva: critical[(nome)] Permite que trechos de cdigo sejam executados em regime de excluso mtua Exemplo:
int prox_x, prox_y; #pragma omp parallel shared(x, y) private(prox_x, prox_y) { #pragma omp critical(eixox) prox_x = dequeue( x ); trataFoo( prox_x, x ); #pragma omp critical(yaxis) prox_y = dequeue( y ); trataFoo( prox_y, y ); }

OpenMP: Diretivas
Diretiva: single [nowait] Indica, em uma regio paralela, um trecho de cdigo que deve ser executado apenas por um nico thread Representa uma barreira Com nowait a barreira pode ser relaxada
Exemplo: #pragma omp parallel { #pragma omp single printf("Serao %d threads\n", omp_get_num_threads() ); foo(); #pragma omp single nowait printf("O threads %d terminou\n", omp_get_thread_num() ); }

OpenMP: Diretivas
Diretiva: master [nowait]
Indica, em uma regio paralela, um trecho de cdigo que deve ser executado apenas thread master Representa uma barreira Com nowait a barreira pode ser relaxada Exemplo:
#pragma omp parallel { #pragma omp master printf("Serao %d threads\n", omp_get_num_threads() ); foo(); #pragma omp master nowait printf("O thread master terminou\n" ); }

OpenMP: Diretivas
Diretiva: barrier sincroniza todas as threads de um time
#pragma omp barrier

Diretiva: atomic
especifica que uma posio de memria deve deve ser atualizada atomicamente #pragma omp atomic <instruo>

OpenMP: Diretivas
Diretiva: schedule afeta como as iteraes do lao so mapeadas entre as threads
schedule(static [,chunk])
Blocos de iteraes de tamanho chunk Distribuio Round robin

schedule(dynamic[,chunk])
Iteraes de tamanho chunk Ao terminar as iteraes, a thread requisita o prximo passo

schedule(guided[,chunk])
Agendamento dinmico iniciado com um tamanho grande O tamanho dos blocos diminui, no menor do que chunk

OpenMP: Diretivas
Exemplo #pragma omp parallel for schedule (static, 8) for( int i = start; i <= end; i += 2 ) { if ( TestForPrime(i) ) gPrimesFound++; }

OpenMP: compilando
OpenMP suportado pelo gcc 4.2 4.1 no Fedora Existem outros compiladores que do suporte Compilao: gcc o <exec> <fonte>.c fopenm Execuo: ./<exec>

OpenMP: variveis ambiente


Alterando o nmero de threads
export OMP_NUM_THREADS = <qtde>