49
,

Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

  • Upload
    lamthuy

  • View
    220

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Introdução ao OpenMP

Threads em CPU multicore

Rogério A. Gonçalves1,2 Alfredo Goldman2

1Departamento de Computação (DACOM)Universidade Tecnológica Federal do Paraná (UTFPR)

2Departamento de Ciência da Computação (DCC)Instituto de Matemática e Estatística (IME)

Universidade de São Paulo (USP)

[email protected], {rag, gold}@ime.usp.br

MAC0242 - Laboratório de Programação II

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 1 / 49

Page 2: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Roteiro

1 Introdução

2 Implementação de Threads

3 Abordagem do OpenMP

4 Diretivas de Compilação

5 Variáveis de Ambiente

6 Diretivas de Compilação

7 Diretivas de Sincronização

8 Bibliogra�a

9 Dúvidas

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 2 / 49

Page 3: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Objetivos

Uma visão geral sobre utilização de multithreading.

Alguns conceitos sobre concorrência e paralelismo.

Apresentar uma introdução sobre OpenMP com exemplos práticos.

Atividades.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 3 / 49

Page 4: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Conceitos I

Arquitetura e Organização de Computadores e Sistemas Operacionais.

Monoprocessado x multiprocessado.

Monoprogramado x multiprogramado.

Processo: programa executando em um computador.

Múltiplos processos podem estar em execução ao mesmo tempo:browser, player de músicas, editor de textos...

Thread: parte de um programa. Processo Leve. Tarefa.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 4 / 49

Page 5: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Conceitos II

Cada processo pode possuir uma ou múltiplas threads.

Exemplos:Um editor de textos, várias tarefas (typing, spell checking, printing...)Um servidor web, cada requisição atendida por uma thread.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 5 / 49

Page 6: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Conceitos I

Em um computador convencional (single core):Cada processo gera pelo menos uma thread (�uxo de execuçãoprincipal).

Um processo é escalonado para execução, logo uma thread está emexecução por vez.Quando uma thread pára (por exemplo, devido a um page fault):

O estado da thread é guardado (registradores, ...)O estado de outra thread em espera é carregado no processador einicia-se sua execução.O que é chamado de troca de contexto (context switching).

Para o usuário parece que todas as threads executam simultaneamente.

Em um computador com processador multicore tem-se a possibilidadede paralelismo físico.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 6 / 49

Page 7: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Conceitos II

Concorrência: Múltiplas tarefas estão logicamente ativas em ummesmo momento.

Paralelismo: Múltiplas tarefas estão realmente ativas em ummesmo momento.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 7 / 49

Page 8: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Implementação de Threads em Linguagens de Programação I

Basicamente em todas as linguagens que suportam threads aimplementação segue a ideia de se ter uma função que é o código aser executado pela thread quando ela for criada.

Na linguagem C, podemos utilizar a biblioteca Pthreads doGNU/Linux.

Implementa a API padrão POSIX (IEEE 1003.1c) para criação esincronismo de thread.

A API especi�ca o comportamento da biblioteca de threads, aimplementação �ca para o desenvolvimento da biblioteca.

A especi�cação POSIX determina que os registradores do processador,a pilha e a máscara de sinal sejam mantidos individualmente para cadathread.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 8 / 49

Page 9: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Implementação de Threads em Linguagens de Programação I

Básico de Pthreads:

Criar uma nova thread1 i n t p th r ead_crea t e ( pthread_t ∗ thread ,2 con s t pthread_att r_t ∗ a t t r ,3 vo i d ∗ (∗ s t a r t_ r o u t i n e ) ( vo i d ∗) ,4 vo i d ∗ arg ) ;

Aguardar pelo término de outra thread1 i n t p th r ead_jo i n ( pthread_t th , vo i d ∗∗ th r ead_re tu rn ) ;

Terminar a thread1 vo i d p th r ead_ex i t ( vo i d ∗ r e t v a l ) ;

Cancelar a execução da thread1 i n t p th read_cance l ( pthread_t th r ead ) ;

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 9 / 49

Page 10: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Implementação de Threads em Linguagens de Programação I

Na linguagem C com Pthreads:

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 10 / 49

Page 11: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Implementação de Threads em Linguagens de Programação I

Em Java existem pelo menos duas formas de criarmos threads.

Figura 1: Criação por Herança Figura 2: Implementação de Interface

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 11 / 49

Page 12: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Implementação de Threads em Linguagens de Programação I

Em Python também podemos criar threads:

Figura 3: Por herança Figura 4: Por alvo

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 12 / 49

Page 13: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Padrão OpenMP

Padrão OpenMP (Open Multi-Processing) (Chapman, 2008)

É Conjunto de diretivas de compilação mais um pequeno conjunto defunções de biblioteca e variáveis de ambiente que usam como base aslinguagens C/C++ e Fortran.

As diretivas de compilação são usadas para anotar o código eguiar o compilador no processo de tradução e paralelização de código.

Nas linguagens C e C++ as diretivas OpenMP são identi�cadas pelo#pragma omp, enquanto que na linguagem Fortran, as diretivas sãoidenti�cadas pela sentinela !$omp.

O código anotado com diretivas de preprocessamento (#pragma) étratado e então o código paralelo é gerado.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 13 / 49

Page 14: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

OpenMP

O OpenMP implementa o modelo fork-join.

As threads são criadas a partir de blocos de código anotados.

A master thread executa sequencialmente até encontrar a primeiraconstrução que delimita uma região paralela.

Uma operação similar a um fork acontece, fazendo com que um timede threads seja criado para executar o bloco que representa a regiãoparalela (a thread mestre participa do time).Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 14 / 49

Page 15: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

OpenMP

Vantagens do uso de OpenMP:Poucas alterações no código serial existente.Fácil compreensão e uso das diretivas.Suporte a paralelismo aninhado.Ajuste dinâmico do número de threads.

Sintaxe dos elementos de OpenMP para C/C++.Variáveis de Ambiente: OMP_NOMESão variáveis que controlam a execução do programa escrito comOpenMP.Diretivas de Compilação: #pragma omp diretiva [cláusula]

Instrui o compilador para processar a seção de código após adiretiva.Biblioteca e Rotinas: omp_serviço(...)Rotinas que manipulam e monitoram as threads, os processadorese as variáveis de ambiente. Existem rotinas para a sincronizaçãodas threads e para medir tempo.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 15 / 49

Page 16: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de Compilação: Construtor Paralelo (exe-001) I

Construtor Paralelo: #pragma omp parallel

É a diretiva mais importante do OpenMP.

É responsável pela indicação da região do código que será executadaem paralelo.

Se esse construtor não for especi�cado o programa será executado deforma sequencial.

Quando a thread inicial encontra um construtor paralelo ela cria umgrupo de threads que irão executar o código e torna-se a thread

mestre desse grupo.

Porém, esse construtor não divide o trabalho entre as threads, apenascria a região paralela.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 16 / 49

Page 17: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de Compilação: Construtor Paralelo (exe-001) II

Sintaxe

1 #pragma omp p a r a l l e l [ c l a u s u l a , . . . ] n o v a l i n h a2 I n s t r u c a o

Cláusulas que podem ser utilizadas nesse construtor

1 i f ( e x p r e s s a o l o g i c a )2 p r i v a t e ( l i s t a de v a r i a v e i s )3 sha r ed ( l i s t a de v a r i a v e i s )4 f i r s t p r i v a t e ( l i s t a de v a r i a v e i s )5 d e f a u l t ( sha r ed | none )6 copy i n ( l i s t a de v a r i a v e i s )7 r e d u c t i o n ( ope rado r : l i s t a de v a r i a v e i s )8 num_threads ( v a r i a v e l i n t e i r a )

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 17 / 49

Page 18: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de Compilação: Construtor Paralelo (exe-001) III

Hello World!!!

1 #inc lude <s t d i o . h>2

3 i n t main ( ) {4 p r i n t f ( " He l l o World ! ! ! \ n" ) ;5 r e t u r n 0 ;6 }

1 #inc lude <s t d i o . h>2 #inc lude <omp . h>3

4 i n t main ( ) {5 #pragma omp p a r a l l e l6 {7 i n t i d = omp_get_thread_num ( ) ;8 p r i n t f ( "Thread[%d ] : He l l o World ! ! ! \ n" , i d ) ;9 }10 r e t u r n 0 ;11 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 18 / 49

Page 19: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de Compilação: Construtor Paralelo (exe-001) IV

Condicional de Compilação - Para tornar possível a compilação de umprograma OpenMP tanto na versão paralela quanto na versãosequencial.

1 #inc lude <s t d i o . h>2 #i f d e f _OPENMP3 #inc lude <omp . h>4 #e l s e5 #def ine omp_get_thread_num ( ) 06 #end i f7

8 i n t main ( ) {9 #pragma omp p a r a l l e l10 {11 i n t i d = omp_get_thread_num ( ) ;12 p r i n t f ( "Thread[%d ] : He l l o World ! ! ! \ n" , i d ) ;13 }14 r e t u r n 0 ;15 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 19 / 49

Page 20: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Variáveis de Ambiente do OpenMP - (exe-002) I1 i n t main ( ) {2 i n t i ;3 i n t O_P; /∗ Numero de P r o c e s s ado r e s . ∗/4 i n t O_T; /∗ Numero de t h r e ad s OpenMP . ∗/5 i n t O_ID ; /∗ I d da Thread OpenMP . ∗/67 p r i n t f ( "Teste 1 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−\n" ) ;8 O_P = omp_get_num_procs ( ) ; /∗ Recupera o numero de p r o c e s s a d o r e s . ∗/9 O_T = omp_get_num_threads ( ) ; /∗ Recupera o numero de t h r e ad s . ∗/10 O_ID = omp_get_thread_num ( ) ; /∗ r e c up e r a o i d da th r ead OpenMP . ∗/11 p r i n t f ( "Thread i d : %d #Procs : %d #Threads : %d\n" , O_ID, O_P, O_T) ;1213 p r i n t f ( "Teste 2 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−\n" ) ;14 #pragma omp p a r a l l e l15 {16 O_P = omp_get_num_procs ( ) ;17 O_T = omp_get_num_threads ( ) ;18 O_ID = omp_get_thread_num ( ) ;19 p r i n t f ( "Thread i d : %d #Procs : %d #Threads : %d\n" , O_ID, O_P, O_T) ;20 }2122 p r i n t f ( "Teste 3 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−\n" ) ;23 #pragma omp p a r a l l e l num_threads (8 )24 {25 O_P = omp_get_num_procs ( ) ;26 O_T = omp_get_num_threads ( ) ;27 O_ID = omp_get_thread_num ( ) ;28 p r i n t f ( "Thread i d : %d #Procs : %d #Threads : %d\n" , O_ID, O_P, O_T) ;29 }30 r e t u r n 0 ;31 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 20 / 49

Page 21: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Variáveis de Ambiente do OpenMP - (exe-002) II

Terminalrogerio@guarani:aula -intro -openmp/src/exe -002$ ./variaveis -omp -03

Teste 1 --------------------------------------------

Thread id: 0 #Procs: 2 #OpenMP Threads: 1

Teste 2 --------------------------------------------

Thread id: 0 #Procs: 2 #OpenMP Threads: 2

Thread id: 1 #Procs: 2 #OpenMP Threads: 2

Teste 3 --------------------------------------------

Thread id: 1 #Procs: 2 #OpenMP Threads: 8

Thread id: 0 #Procs: 2 #OpenMP Threads: 8

Thread id: 6 #Procs: 2 #OpenMP Threads: 8

Thread id: 4 #Procs: 2 #OpenMP Threads: 8

Thread id: 2 #Procs: 2 #OpenMP Threads: 8

Thread id: 7 #Procs: 2 #OpenMP Threads: 8

Thread id: 5 #Procs: 2 #OpenMP Threads: 8

Thread id: 3 #Procs: 2 #OpenMP Threads: 8

rogerio@guarani:aulas -openmp/aula -intro -openmp/src/exe -002$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 21 / 49

Page 22: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

São construtores responsáveis pela distribuição de trabalho entre asthreads.Em C/C++ existem três tipos de Construtores de Compartilhamentode Trabalho:

Diretiva for

Diretiva sections

Diretiva single

Indicam a forma como o trabalho será dividido, mas não criam novasthreads.

Estas diretivas devem estar dentro de uma região paralela.

Existe uma barreira implícita no �nal do construtor, todas as threadsesperam até que a última thread �nalize sua execução.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 22 / 49

Page 23: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Construtor: #pragma omp for

Faz com que as iterações do laço de repetição localizado logo abaixoda diretiva sejam executadas em paralelo.

As iterações são distribuídas entre as threads do grupo criado naregião paralela.

Sintaxe

1 #pragma omp f o r [ c l a u s u l a , . . . ]2 f o r−l oop

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 23 / 49

Page 24: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho II

Cláusulas que podem ser utilizadas nesse construtor

1 p r i v a t e ( l i s t a de v a r i v e i s )2 f i r s t p r i v a t e ( l i s t a de v a r i v e i s )3 l a s t p r i v a t e ( l i s t a de v a r i a v e i s )4 r e d u c t i o n ( ope rado r : l i s t a de v a r i a v e i s )5 s c h edu l e ( t i po , [ , tamanho do chunk ] )6 nowa i t7 o rd e r ed

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 24 / 49

Page 25: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Exemplo [exe-003]:

1 #def ine SIZE 162

3 i n t main ( ) {4 i n t A[ SIZE ] , i ;5 #pragma omp p a r a l l e l f o r6 f o r ( i = 0 ; i < SIZE ; i++){7 A[ i ] = i ∗ i ;8 p r i n t f ( "Th[%d ] : %02d = %03d\n" , omp_get_thread_num ( ) ,

i , A [ i ] ) ;9 }10

11 r e t u r n 0 ;12 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 25 / 49

Page 26: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho II

Terminalrogerio@guarani:aula -intro -openmp/src/exe -003$ ./vetquad -omp -03

Th[0]: 00 = 000

Th[0]: 01 = 001

Th[0]: 02 = 004

Th[0]: 03 = 009

Th[0]: 04 = 016

Th[0]: 05 = 025

Th[0]: 06 = 036

Th[0]: 07 = 049

Th[1]: 08 = 064

Th[1]: 09 = 081

Th[1]: 10 = 100

Th[1]: 11 = 121

Th[1]: 12 = 144

Th[1]: 13 = 169

Th[1]: 14 = 196

Th[1]: 15 = 225

rogerio@guarani:aula -intro -openmp/src/exe -003$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 26 / 49

Page 27: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Exemplo [exe-003]:

1 #def ine SIZE 162

3 i n t main ( ) {4 i n t A[ SIZE ] , i ;5 #pragma omp p a r a l l e l f o r s c h edu l e ( s t a t i c , 2)6 f o r ( i = 0 ; i < SIZE ; i++){7 A[ i ] = i ∗ i ;8 p r i n t f ( "Th[%d ] : %02d = %03d\n" , omp_get_thread_num ( ) ,

i , A [ i ] ) ;9 }10

11 r e t u r n 0 ;12 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 27 / 49

Page 28: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho II

Terminalrogerio@guarani:aula -intro -openmp/src/exe -003$ ./vetquad -omp -03

Th[0]: 00 = 000

Th[0]: 01 = 001

Th[0]: 04 = 016

Th[0]: 05 = 025

Th[0]: 08 = 064

Th[0]: 09 = 081

Th[0]: 12 = 144

Th[0]: 13 = 169

Th[1]: 02 = 004

Th[1]: 03 = 009

Th[1]: 06 = 036

Th[1]: 07 = 049

Th[1]: 10 = 100

Th[1]: 11 = 121

Th[1]: 14 = 196

Th[1]: 15 = 225

rogerio@guarani:aula -intro -openmp/src/exe -003$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 28 / 49

Page 29: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Exemplo [exe-003]:

1 #def ine SIZE 162

3 i n t main ( ) {4 i n t A[ SIZE ] , i ;5 #pragma omp p a r a l l e l f o r s c h edu l e ( s t a t i c , 2) num_threads

(4 )6 f o r ( i = 0 ; i < SIZE ; i++){7 A[ i ] = i ∗ i ;8 p r i n t f ( "Th[%d ] : %02d = %03d\n" , omp_get_thread_num ( ) ,

i , A [ i ] ) ;9 }10

11 r e t u r n 0 ;12 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 29 / 49

Page 30: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho II

Terminalrogerio@guarani:aula -intro -openmp/src/exe -003$ ./vetquad -omp -03

Th[2]: 04 = 016

Th[2]: 05 = 025

Th[2]: 12 = 144

Th[2]: 13 = 169

Th[3]: 06 = 036

Th[3]: 07 = 049

Th[3]: 14 = 196

Th[3]: 15 = 225

Th[0]: 00 = 000

Th[0]: 01 = 001

Th[0]: 08 = 064

Th[0]: 09 = 081

Th[1]: 02 = 004

Th[1]: 03 = 009

Th[1]: 10 = 100

Th[1]: 11 = 121

rogerio@guarani:aula -intro -openmp/src/exe -003$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 30 / 49

Page 31: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Exemplo [exe-003]:

1 #def ine SIZE 162

3 i n t main ( ) {4 i n t A[ SIZE ] , i ;5 #pragma omp p a r a l l e l f o r s c h edu l e ( s t a t i c , 2) num_threads

(4 ) o rd e r ed6 f o r ( i = 0 ; i < SIZE ; i++){7 A[ i ] = i ∗ i ;8 p r i n t f ( "Th[%d ] : %02d = %03d\n" , omp_get_thread_num ( ) ,

i , A [ i ] ) ;9 }10

11 r e t u r n 0 ;12 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 31 / 49

Page 32: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho II

Terminalrogerio@guarani:aula -intro -openmp/src/exe -003$ ./vetquad -omp -03

Th[2]: 04 = 016

Th[2]: 05 = 025

Th[1]: 02 = 004

Th[1]: 03 = 009

Th[3]: 06 = 036

Th[3]: 07 = 049

Th[0]: 00 = 000

Th[0]: 01 = 001

Th[0]: 08 = 064

Th[0]: 09 = 081

Th[1]: 10 = 100

Th[1]: 11 = 121

Th[2]: 12 = 144

Th[2]: 13 = 169

Th[3]: 14 = 196

Th[3]: 15 = 225

rogerio@guarani:aula -intro -openmp/src/exe -003$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 32 / 49

Page 33: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Construtor: #pragma omp sections

É utilizado para dividir tarefas entre as threads em blocos de códigoque não possuem iterações.

Cada thread irá executar um bloco de código diferente especi�cadopor #pragma omp section. executar.

Sintaxe

1 #pragma omp s e c t i o n s [ c l a u s u l a , . . . ] n o v a l i n h a2 {3 #pragma omp s e c t i o n no v a l i n h a4 i n s t r u c a o5 #pragma omp s e c t i o n no v a l i n h a6 i n s t r u c a o7 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 33 / 49

Page 34: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Exemplo sections:

1 vo i d somarVetores ( doub l e ∗a , doub l e ∗b , doub l e ∗c , i n t n ) {2 f o r ( i n t i = 0 ; i < n ; i++){3 c [ i ] = a [ i ] + b [ i ] ;4 }5 }6

7 vo i d s u b t r a i r V e t o r e s ( doub l e ∗a , doub l e ∗b , doub l e ∗d , i n tn ) {

8 f o r ( i n t i = 0 ; i < n ; i++){9 d [ i ] = a [ i ] − b [ i ] ;10 }11 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 34 / 49

Page 35: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho II

1 i n t main ( ) {2 /∗ . . . ∗/3 #pragma omp p a r a l l e l4 {5 #pragma omp s e c t i o n s6 {7 #pragma omp s e c t i o n8 somarVetores ( a , b , c , n ) ;9

10 #pragma omp s e c t i o n11 s u b t r a i r V e t o r e s ( a , b , d , n ) ;12 }13 }14 r e t u r n 0 ;15 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 35 / 49

Page 36: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho I

Construtor: #pragma omp single

Indica que o trecho de código deve ser executado por apenas umathread.

A primeira thread que atingir a região executará, não necessariamentea mestre.

As outras threads esperam em uma barreira implícita no �nal doconstrutor single, até que a thread que encontrou o construtortermine.

Sintaxe

1 #pragma omp s i n g l e [ c l a u s u l a , . . . ]2 i n s t r u c a o . . .

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 36 / 49

Page 37: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho II

1 i n t main ( ) {2 i n t A[ SIZE ] , i ;3

4 #pragma omp p a r a l l e l num_threads (4 )5 {6 #pragma omp s i n g l e7 p r i n t f ( " I n i c i o da r e g i a o p a r a l e l a , numero de t h r e ad s =

%d\n" , omp_get_num_threads ( ) ) ;8

9 #pragma omp f o r s c h edu l e ( s t a t i c , 3)10 f o r ( i = 0 ; i < SIZE ; i++){11 A[ i ] = i ∗ i ;12 p r i n t f ( "Thread %d execu ta a i t e r a c a o %02d do loop . \ n

" , omp_get_thread_num ( ) , i ) ;13 }14 }15 r e t u r n 0 ;16 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 37 / 49

Page 38: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Construtores de compartilhamento de trabalho III

Terminalrogerio@guarani:aula -intro -openmp/src/exe -006$ ./vetquad -omp -06

Inicio da regiao paralela , numero de threads = 4

Thread 2 executa a iteracao 06 do loop.

Thread 2 executa a iteracao 07 do loop.

Thread 2 executa a iteracao 08 do loop.

Thread 3 executa a iteracao 09 do loop.

Thread 3 executa a iteracao 10 do loop.

Thread 3 executa a iteracao 11 do loop.

Thread 1 executa a iteracao 03 do loop.

Thread 1 executa a iteracao 04 do loop.

Thread 1 executa a iteracao 05 do loop.

Thread 1 executa a iteracao 15 do loop.

Thread 0 executa a iteracao 00 do loop.

Thread 0 executa a iteracao 01 do loop.

Thread 0 executa a iteracao 02 do loop.

Thread 0 executa a iteracao 12 do loop.

Thread 0 executa a iteracao 13 do loop.

Thread 0 executa a iteracao 14 do loop.

rogerio@guarani:aula -intro -openmp/src/exe -006$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 38 / 49

Page 39: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização I

Como uma variável pode ser privada (private) ou compartilhada(shared).

Uma vez que as variáveis compartilhadas são visíveis por todas asthreads que executam o código.

O acesso a elas deve ser sincronizado par evitar "condições de corrida".

O construtor critical restringe a execução de uma tarefa a apenasuma thread por vez.

Sintaxe

1 #pragma omp c r i t i c a l [ ( nome) ] n o v a l i n h a2 i n s t r u c a o

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 39 / 49

Page 40: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização II

Quando uma thread encontra uma sessão crítica, ela espera no inícioda mesma até que nenhuma thread esteja executando as instruções daregião crítica.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 40 / 49

Page 41: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização III

1 #def ine SIZE 162

3 i n t main ( ) {4 i n t A[ SIZE ] , B [ SIZE ] , i ;5 i n t aux_dot = 0 ;6 i n t dot = 0 ;7

8 f o r ( i = 0 ; i < SIZE ; i++){9 A[ i ] = i ;10 B[ i ] = i ;11 }12

13 #pragma omp p a r a l l e l f i r s t p r i v a t e ( dot )14 {15 #pragma omp s i n g l e16 p r i n t f ( " I n i c i o da r e g i a o p a r a l e l a , numero de t h r e ad s =

%d\n" , omp_get_num_threads ( ) ) ;17

18 #pragma omp f o r

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 41 / 49

Page 42: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização IV

19 f o r ( i = 0 ; i < SIZE ; i++){20 aux_dot += A[ i ] ∗ B[ i ] ;21 p r i n t f ( "Thread %d execu ta a i t e r a c a o %02d do loop :

%d ∗ %d = %d −> %d \n" , omp_get_thread_num ( ) , i, A [ i ] , B [ i ] , (A [ i ] ∗ B[ i ] ) , aux_dot ) ;

22 }23

24 #pragma omp c r i t i c a l25 dot += aux_dot ;26

27 #pragma omp master28 p r i n t f ( "Produto f i n a l : %d . \ n" , dot ) ;29 }30

31 r e t u r n 0 ;32 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 42 / 49

Page 43: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização V

Terminalrogerio@guarani:aula -intro -openmp/src/exe -007$ ./ vetdot

Inicio da regiao paralela , numero de threads = 2

Thread 1 executa a iteracao 08 do loop: 8 * 8 = 64 -> 64

Thread 1 executa a iteracao 09 do loop: 9 * 9 = 81 -> 145

Thread 1 executa a iteracao 10 do loop: 10 * 10 = 100 -> 245

Thread 1 executa a iteracao 11 do loop: 11 * 11 = 121 -> 366

Thread 1 executa a iteracao 12 do loop: 12 * 12 = 144 -> 510

Thread 1 executa a iteracao 13 do loop: 13 * 13 = 169 -> 679

Thread 1 executa a iteracao 14 do loop: 14 * 14 = 196 -> 875

Thread 1 executa a iteracao 15 do loop: 15 * 15 = 225 -> 1100

Thread 0 executa a iteracao 00 do loop: 0 * 0 = 0 -> 64

Thread 0 executa a iteracao 01 do loop: 1 * 1 = 1 -> 1101

Thread 0 executa a iteracao 02 do loop: 2 * 2 = 4 -> 1105

Thread 0 executa a iteracao 03 do loop: 3 * 3 = 9 -> 1114

Thread 0 executa a iteracao 04 do loop: 4 * 4 = 16 -> 1130

Thread 0 executa a iteracao 05 do loop: 5 * 5 = 25 -> 1155

Thread 0 executa a iteracao 06 do loop: 6 * 6 = 36 -> 1191

Thread 0 executa a iteracao 07 do loop: 7 * 7 = 49 -> 1240

Produto final: 1240.

rogerio@guarani:aula -intro -openmp/src/exe -007$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 43 / 49

Page 44: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização I

A diretiva barrier é utilizada para sincronizar todas as threads emum determinado ponto do código.

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 44 / 49

Page 45: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização II

Quando uma thread encontra uma barreira, ela espera até que todasas threads cheguem naquele ponto e, a partir daí, elas continuam aexecução.

Os construtores como parallel, for, sections e single tem barreirasimplícitas.

Utilizadas para evitar condições de corrida, impedindo que uma thread

acesse uma variável antes que ela seja atulizada.

Sintaxe

1 #pragma omp b a r r i e r n o v a l i n h a

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 45 / 49

Page 46: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização III

1 i n t main ( ) {2 i n t i d ;3 #pragma omp p a r a l l e l p r i v a t e ( i d ) num_threads (8 )4 {5 i d = omp_get_thread_num ( ) ;6

7 i f ( i d < omp_get_num_threads ( ) /2)8 system ( " s l e e p 3" ) ;9

10 p r i n t f ( "[%d ] Antes da b a r r e i r a . \ n" , i d ) ;11

12 #pragma omp b a r r i e r13 p r i n t f ( "[%d ] Depo i s da b a r r e i r a . \ n" , i d ) ;14 }15

16 r e t u r n 0 ;17 }

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 46 / 49

Page 47: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Diretivas de sincronização IV

Terminalrogerio@guarani:aula -intro -openmp/src/exe -008$ ./ barrier

[6] Antes da barreira.

[4] Antes da barreira.

[7] Antes da barreira.

[5] Antes da barreira.

[1] Antes da barreira.

[3] Antes da barreira.

[0] Antes da barreira.

[2] Antes da barreira.

[2] Depois da barreira.

[7] Depois da barreira.

[4] Depois da barreira.

[5] Depois da barreira.

[1] Depois da barreira.

[6] Depois da barreira.

[3] Depois da barreira.

[0] Depois da barreira.

rogerio@guarani:aula -intro -openmp/src/exe -008$

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 47 / 49

Page 48: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Referências

Tutorial de OpenMP C/C++:

http://www.lncc.br/pdf_consultar.php?idt_arquivo=4286

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 48 / 49

Page 49: Introdução ao OpenMPgrenoble.ime.usp.br/~gold/cursos/2014/labprogII/aulas/aulaOpenMP.pdf · de paralelismo físico. ... Implementação de Threads em Linguagens de ProgramaçãoI

Obrigado!

[email protected]

[email protected]

Gonçalves, Goldman Introdução ao OpenMP 12 de novembro de 2014 49 / 49