introdução ao openmpoberlan/dce11720/aulas/aula19.pdfintrodução ao openmp author processamento...
TRANSCRIPT
![Page 1: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/1.jpg)
Introdução ao OpenMP
Processamento Paralelo
Prof. Oberlan RomãoDepartamento de Computação e Eletrônica – DCELCentro Universitário Norte do Espírito Santo – CEUNESUniversidade Federal do Espírito Santo
![Page 2: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/2.jpg)
OpenMP
O que é OpenMP?
• Open Multi-Processing (OpenMP)
• API para paralelismo em computadores com vários processadores(núcleo) de memória compartilhada
• Parte do programa contém um único thread e parte vários threads
• Possui 3 componentes• Diretivas de compilador que podem ser colocadas em programas C/C++
ou Fortran• Biblioteca de tempo de execução para configuração e consulta de
parâmetros paralelos (por exemplo, #threads)• Variáveis de ambiente que definem parâmetros paralelos de tempo de
execução (por exemplo, #threads)
1/37
![Page 3: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/3.jpg)
OpenMP
Objetivos
• Padronizar
• Simplificar
• Facilitar o uso
• Permitir portabilidade
2/37
![Page 4: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/4.jpg)
OpenMP
Modelo de programação
• Threads dinâmicas
• Paralelismo explícito e aninhável
• Diretivas de compilador
• Modelo Fork-Join
3/37
![Page 5: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/5.jpg)
OpenMP
Modelo Fork-Join
• OpenMP usa o modelo fork-join da execução paralela:
• Todos os programas com OpenMP começam como um único processo: o threadmestre, que é executado sequencialmente até que a primeira construção da regiãoparalela seja encontrada
• FORK: o thread mestre cria um grupo de threads paralelos
• As instruções no programa da região paralela são executadas em paralelo pelosthreads do grupo
• JOIN: Quando os threads concluem as instruções da região paralela, eles sãosincronizados e finalizados, deixando apenas o thread mestre
• O número de regiões paralelas e os threads que os compõem são arbitrários4/37
![Page 6: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/6.jpg)
OpenMP
Diretivas
• Uma diretiva é uma linha especial de código com significado especialapenas para determinados compiladores
• Uma diretiva se distingue pela existência de uma sentinela no começo dalinha
• Em C/C++, a sentinela do OpenMP é:
#pragma omp
• O compilador interpreta essas diretivas e gera chamadas de bibliotecapara paralelizar regiões de código
5/37
![Page 7: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/7.jpg)
OpenMP
DiretivasUsadas para:
• Criar regiões paralelas
• Distribuir blocos de código
• Distribuir iterações de laços
• Sincronizar threads
• . . .
Modelo:
#pragma omp directive [clause , ...]
6/37
![Page 8: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/8.jpg)
OpenMP
• #pragma omp parallel• Diretiva paralela mais básica do OpenMP
• O número de threads que executam o bloco de código seguinte édeterminado pelo sistema em tempo de execução
7/37
![Page 9: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/9.jpg)
OpenMP
Regiões paralelas
#pragma omp parallel \private (var1, var2, ...) \shared (var1, var2, ...) \firstprivate(var1, var2, ...) \copyin(var1, var2, ...) \reduction(operator:var1, var2, ...) \if(expression) \default(shared|none) \num_threads(thread_count) \
{...bloco de código...
}
8/37
![Page 10: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/10.jpg)
OpenMP
Regiões paralelas
• Uma região paralela é um bloco de código executado por todos threadssimultaneamente
• Cada thread tem um ID, que é um inteiro de 0 (o thread mestre) até onúmero de threads menos um
• Pode ser determinado pela função omp_get_thread_num()
• Threads podem executar diferentes instruções na região paralela• Normalmente feito usando a ID do thread:
#pragma omp parallel{
myid = omp_get_thread_num ();if (myid == 0)
do_something ();else
do_something_else(myid);}
9/37
![Page 11: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/11.jpg)
OpenMP
Exemplo 1
#include <stdio.h>#include <omp.h>
int main(int argc , char *argv[]){int numThreads = atoi(argv[1]);
#pragma omp parallel num_threads(numThreads)printf("Hello , world .\n");
return 0;}
10/37
![Page 12: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/12.jpg)
OpenMP
Exemplo 2
#include <omp.h>#include <stdio.h>#include <stdlib.h>
int main (int argc , char *argv[]) {#pragma omp parallel{
int 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 */return 0;
}11/37
![Page 13: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/13.jpg)
OpenMP
Regiões paralelas: Modos de execução
• “Modo dinâmico” (o padrão)• O número de threads usados em uma região paralela pode variar, sob
controle do sistema operacional, de uma região paralela para outra• Definir o número de threads apenas define o número máximo de threads
• “Modo estático”• O número de threads é fixado pelo programador;
• As regiões paralelas podem ser aninhadas, mas um compilador podeoptar por “serializar” a região paralela interna, ou seja, executá-la em umúnico thread
• O modo de execução é controlado por• A variável de ambiente OMP_DYNAMIC• A função OMP omp_set_dynamic()
12/37
![Page 14: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/14.jpg)
OpenMP
Cláusulas da diretiva do OpenMP
• shared(var1,var2,...)• Variáveis a serem compartilhadas entre todos os threads (threads
acessam os mesmos locais de memória)
• private(var1,var2,..)• Cada thread tem sua própria cópia das variáveis na execução do código
paralelo.
• firstprivate(var1,var2,...)• Variáveis privadas que são inicializadas quando o código paralelo é
iniciado
• lastprivate(var1,var2,...)• Variáveis privadas que tem seus valores salvos na última iteração
13/37
![Page 15: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/15.jpg)
OpenMP
Cláusulas da diretiva do OpenMP
• if(expression)• Paraleliza o código apenas se a expression for verdadeira.
• default(shared|private|none)• Especifica o escopo padrão para variáveis em código paralelo.
• schedule(type [,chunk])• Controla como as iterações de um loop são distribuídas entre os threads
• reduction(operator|intrinsic:var1,var2...)• Garante que uma operação de redução (por exemplo, uma soma global)
seja executada com segurança
14/37
![Page 16: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/16.jpg)
OpenMP
Escopo de variáveis
• Na programação sequencial, o escopo de uma variável consiste naspartes de um programa em que a variável pode ser usada
• Em OpenMP, o escopo de uma variável se refere ao conjunto de threadsque podem acessar a variável em um bloco paralelo.
• Uma variável que pode ser acessada por todos os threads do grupo temescopo compartilhado (shared)
• Uma variável que só pode ser acessada por um único thread tem escopoprivado (private)
• O escopo padrão para variáveis declaradas antes de um bloco paralelo écompartilhado.
15/37
![Page 17: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/17.jpg)
OpenMP
if(expression)
• Só executa em paralelo se expression for avaliada como verdadeira
• Caso contrário, executa sequencialmente
private(var1,var2,...)
• Nenhuma associação de armazenamento com a variável original
• Todas as referências são para uma variável local
• Os valores são indefinidos no inicio e no fim
shared(var1,var2,...)
• Os dados são acessíveis por todos os threads do grupo
• Todos os threads acessam o mesmo espaço de endereçamento
#pragma omp parallel if (n > 10) shared(n,x,y) private(i){} 16/37
![Page 18: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/18.jpg)
OpenMP
Diretivas para Compartilhamento de Trabalho
• #parallel for
• #parallel sections
• Colocados dentro de regiões paralelas
• Distribui a execução de instruções entre os threads existentes
17/37
![Page 19: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/19.jpg)
OpenMP diretiva: for
#parallel for
#pragma omp parallel shared(a,b) private(j){
#pragma omp forfor (j = 0; j < N; j++)
a[j] = a[j] + b[j];}
• Distribui iterações do loop imediatamente a seguir entre os threads deum grupo
• Por padrão, há uma barreira no final do loop• Os threads aguardam até que tudo esteja concluído e, em seguida,
prosseguem• Use a cláusula nowait para permitir que os threads continuem sem
aguardar
18/37
![Page 20: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/20.jpg)
OpenMP diretiva: for
#parallel for
#pragma omp parallel shared(a,b) private(j){
#pragma omp forfor (j = 0; j < N; j++)
a[j] = a[j] + b[j];}
• Distribui iterações do loop imediatamente a seguir entre os threads deum grupo
• Por padrão, há uma barreira no final do loop• Os threads aguardam até que tudo esteja concluído e, em seguida,
prosseguem• Use a cláusula nowait para permitir que os threads continuem sem
aguardar
18/37
![Page 21: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/21.jpg)
OpenMP diretiva: for
Formas legais para declarações for paralelizáveis
19/37
![Page 22: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/22.jpg)
OpenMP diretiva: for
#parallel for
#pragma omp for [clause [clause]...]for loop
onde cada clause pode ser
• private(var1,var2,...)
• firstprivate(var1,var2,...)
• lastprivate(var1,var2,...)
• reduction(operator: var1,var2,...)
• ordered
• schedule(type [, chunk_size])
• nowait
20/37
![Page 23: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/23.jpg)
OpenMP diretiva: for
firstprivate(var1,var2,...)
• Variáveis são privadas (locais para cada thread), mas são inicializadascom o valor do código sequencial anterior
int myid , c = 98;#pragma omp parallel private(myid) firstprivate(c){
myid=omp_get_thread_num ();printf("T:%d c=%d", myid , c);
}
T:1 c=98T:3 c=98T:2 c=98T:0 c=98
• Cada thread tem uma cópia privada de c, inicializada com o valor 98
21/37
![Page 24: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/24.jpg)
OpenMP diretiva: for
lastprivate(var1,var2,...)
• O valor correspondente à última iteração do loop (no modo serial) ésalvo após a construção paralela
#pragma omp parallel for lastprivate(x){
for(i=1; i<=n; i++){x = sin((float)i );a[i] = exp(x);
}}lastx = x;
• Se x for declarado com private, o valor de lastx é indefinido!
22/37
![Page 25: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/25.jpg)
OpenMP diretiva: for
ordered
• Usado quando parte do loop deve executar em ordem sequencial
#pragma omp parallel for private(myval) ordered{
for(i=1; i<=n; i++){myval = do_lots_of_work(i);#pragma omp ordered{
printf("%d %d\n", i, myval);}
}}
23/37
![Page 26: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/26.jpg)
OpenMP diretiva: for
reduction(operator: var1,var2,...)
for(i = 1; i <= n; i++){sum = sum + a[i];
}
• sum é a variável de redução
• Não pode ser declarada como shared: threads sobrescreveriam o valorde sum
• Não pode ser declarado como private: variáveis privadas não persistemfora da região paralela
• Com a cláusula de redução, o compilador gera código de tal forma queuma condição de corrida é evitada
24/37
![Page 27: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/27.jpg)
OpenMP diretiva: for
reduction(operator: var1,var2,...)
#pragma omp parallel for reduction(+:sum){
for(i=1; i<=n; i++){sum = sum + a[i];
}}
• operator pode ser:
+, *, -, &, ^, |, &&, ||
25/37
![Page 28: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/28.jpg)
Quais loops são paralelizáveis?
Paralelizáveis
• Número de iterações conhecidas na entrada e não altera
• Cada iteração é independente de todas as outras
• Nenhuma dependência de dados
Não paralelizáveis
• Loops condicionais (muitos loops while)
• Iterações dependentes umas das outras
• Dependência de dados
26/37
![Page 29: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/29.jpg)
OpenMP diretiva: section
• Permitem blocos separados de código serem executados em paralelo (ex.diversas subrotinas independentes)
• Não é escalável: o código fonte deve determinar a quantidade deparalelismo disponível
• Barreira implícita no final da construção das seções• Use a cláusula nowait para suprimir isso
#pragma omp sections{
#pragma omp section/* first section */#pragma omp section/* next section */
}
27/37
![Page 30: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/30.jpg)
OpenMP diretiva: section
Exemplo
#include <omp.h>#define N 1000int main () {
int i;double a[N], b[N], c[N],
d[N];/*Some initializations*/for (i = 0; i < N; i++) {
a[i] = i * 1.5;b[i] = i + 22.35;
}
#pragma omp parallel \shared(a,b,c,d) private(i)
{#pragma omp sections nowait{
#pragma omp sectionfor (i=0; i < N; i++)
c[i] = a[i] + b[i];#pragma omp section
for (i=0; i < N; i++)d[i] = a[i] * b[i];
} /*end of sections*/} /*end of parallel section*/return 0;
}
28/37
![Page 31: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/31.jpg)
Diretivas de sincronização
![Page 32: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/32.jpg)
OpenMP: Sincronização
O que é necessário?
• É necessário sincronizar ações em variáveis compartilhadas
• É necessário assegurar a ordenação correta de leituras e escritas.
• É necessário proteger a atualização de variáveis compartilhadas (nãoatômicas por padrão).
29/37
![Page 33: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/33.jpg)
OpenMP: Diretiva single
• Indica que um bloco de código deve ser executado apenas por um thread
• A primeira thread que alcançar a diretiva single irá executar o bloco
• Outros threads deve esperar até que o bloco seja executado• a menos que um nowait seja especificado
• Sintaxe:
#pragma omp single
30/37
![Page 34: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/34.jpg)
OpenMP: Diretiva single
Exemplo
#pragma omp parallel{
#pragma omp forfor( int i=0; i<N; i++ )
a[i] = f0(i);#pragma omp singlex = f1(a);#pragma omp forfor(int i=0; i<N; i++ )
b[i] = x * f2(i);}
31/37
![Page 35: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/35.jpg)
OpenMP: Diretiva master
• Indica que um bloco deve ser executado apenas pelo thread master(thread 0)
• Outros threads pulam o bloco e continuam a execução• Diferente da diretiva single neste aspecto
• Na maior parte das vezes utilizada para I/O
• Sintaxe:
#pragma omp master
32/37
![Page 36: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/36.jpg)
OpenMP: Diretiva master
Exemplo
#pragma omp parallel{
#pragma omp forfor( int i=0; i<100; i++ )
a[i] = f0(i);#pragma omp masterx = f1(a);
}
33/37
![Page 37: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/37.jpg)
OpenMP: Diretiva barrier
• Suponha que rodamos cada um desses dois loops em paralelo sobre i:
for (i=0; i < N; i++) a[i] = b[i] + c[i];
for (i=0; i < N; i++) d[i] = a[i] + b[i];
• Isso pode nos dar uma resposta errada (um dia). Por quê?
34/37
![Page 38: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/38.jpg)
OpenMP: Diretiva barrier
• Suponha que rodamos cada um desses dois loops em paralelo sobre i:
for (i=0; i < N; i++) a[i] = b[i] + c[i];
for (i=0; i < N; i++) d[i] = a[i] + b[i];
• Isso pode nos dar uma resposta errada (um dia). Por quê?
34/37
![Page 39: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/39.jpg)
OpenMP: Diretiva barrier
• Precisamos ter atualizado todos os a[] primeiro, antes de usar a[]
for (i=0; i < N; i++) a[i] = b[i] + c[i];
for (i=0; i < N; i++) d[i] = a[i] + b[i];
espera!barreira
• Todos os threads aguardam no ponto de barreira e só continuam quandotodos os threads o atingirem
35/37
![Page 40: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/40.jpg)
OpenMP: Diretiva barrier
• Nenhuma thread pode prosseguir além da barreira até que todas asoutras threads chegarem até ela
• Note que há uma barreira implícita no final das diretivas for, sectionse single
• Sintaxe:
#pragma omp barrier
36/37
![Page 41: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/41.jpg)
OpenMP: Diretiva barrier
Quando usar barreiras?
• Quando os dados são atualizados de forma assíncrona e a integridadedos dados está em risco
• Exemplo:• Entre partes do código que lê e grava a mesma seção da memória
• Infelizmente, barreiras tendem a ser “caras” computacionalmente
• Portanto, use-as com cuidado.
37/37
![Page 42: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/42.jpg)
OpenMP: Diretiva nowait
• A cláusula nowait pode ser usada para suprimir as barreiras implícitasno final das diretivas for, sections e single
• Sintaxe:
#pragma omp for nowaitfor loop
• Igualmente para sections e single
38/37
![Page 43: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/43.jpg)
OpenMP: Diretiva nowait
Exemplo: dois laços sem dependência
#pragma omp parallel{
#pragma omp for nowaitfor(int i=0; i<100; i++ )
a[i] = f(i);#pragma omp for nowaitfor(int i=0; i<100; i++ )
b[i] = sqrt(i)*2.0;}
39/37
![Page 44: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/44.jpg)
OpenMP: Diretiva nowait
• Use com extremo cuidado
• É muito fácil remover uma barreira que é necessária
• Isso resulta no pior tipo de erro: comportamento não-determinístico daaplicação (às vezes o resultado é correto, às vezes não)
40/37
![Page 45: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/45.jpg)
OpenMP: Diretiva critical
Região critica
• Se sum é uma variável compartilhada, este loop não pode ser executadoem paralelo
for (i=0; i < N; i++){ ... sum += a[i]; ...}
• Podemos usar uma região crítica para isso:
for (i=0; i < N; i++){ ... sum += a[i]; ...}
um de cada vez pode prosseguir
41/37
![Page 46: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/46.jpg)
OpenMP: Diretiva critical
Região critica
• Útil para evitar uma condição de corrida ou para executar I/O
• Todos os threads executam o código, mas apenas um de cada vez
• Sintaxe:
#pragma omp critical
42/37
![Page 47: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/47.jpg)
OpenMP: Diretiva atomic
Região critica
• Usada para proteger uma atualização única em uma variávelcompartilhada
• Uma forma leve e especial de uma seção crítica
• Aplica-se apenas a uma única sentença
• Sintaxe:
#pragma omp atomicstatement
Onde statement deve ter uma das seguintes forma:• x op = expr, x++, ++x, x– ou –x
e op pode ser: +, -, *, /, &, ˆ, «, »
• Alternativa ao uso da cláusula reduction (aplica-se aos mesmos tiposde expressões).
43/37
![Page 48: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/48.jpg)
OpenMP: critical ou atomic
• Como regra simples, use a diretiva atomic sempre que possível: máximode otimização
• Se não for possível use a diretiva critical
44/37
![Page 49: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/49.jpg)
Dúvidas?
44/37
![Page 50: Introdução ao OpenMPoberlan/DCE11720/Aulas/Aula19.pdfIntrodução ao OpenMP Author Processamento Paralelo Created Date 5/17/2018 7:06:04 AM](https://reader034.vdocuments.mx/reader034/viewer/2022043000/5f75ddc7b80c1037cb3021e0/html5/thumbnails/50.jpg)
Referências
• OpenMPhttp://www.openmp.org/
• OpenMPhttps://computing.llnl.gov/tutorials/openMP
• What is OpenMP?https://www.dartmouth.edu/~rc/classes/intro_openmp/
• Programação paralela e distribuída – OpenMPhttp://www.dcc.ufrj.br/~gabriel/progpar/OpenMP.pdf
45/37