Post on 08-Aug-2015
Mini Curso: Programação Paralela utilizando OpenMP
Arthur F. Lorenzon Antonio Carlos S. B. F.
Henrique O. GresslerMárcia C. Cera
2
Quem somos...
● Arthur Francisco Lorenzon:
● Bacharel em CC pela UNIPAMPA
● Aluno do PPGC/UFRGS
● Integrante do Laboratório de Sistemas Embarcados – UFRGS
● Henrique de Oliveira Gressler
● Márcia Cristina Cera
● Antonio Carlos S. B. Filho
3
Quem somos...
● Arthur Francisco Lorenzon
● Henrique de Oliveira Gressler:
● Bacharel em Ciência da Computação pela UNIPAMPA
● Márcia Cristina Cera
● Antonio Carlos S. B. Filho
4
Quem somos...
● Arthur Francisco Lorenzon
● Henrique de Oliveira Gressler
● Márcia Cristina Cera:
● Doutorado em Computação pela UFRGS
● Professora Adjunta da UNIPAMPA
● Pesquisadora da área de PPD
● Antonio Carlos S. B. Filho
5
Quem somos...
● Arthur Francisco Lorenzon
● Henrique de Oliveira Gressler
● Márcia Cristina Cera
● Antonio Carlos S. B. Filho:
● Pós-Doutorado em Computação – UFRGS
● Professor Adjunto da UFRGS
● Bolsista de Produtividade em Pesquisa do CNPq – Nível 2
6
Experiência dos Palestrantes...
● Diversas aplicações paralelizadas utilizando OpenMP
● Diversos trabalhos publicados utilizando OpenMP
● Participação em eventos/grupos de pesquisa:
● Maratona de Programação Paralela – Petrópolis/RJ 2012
● Grupo de Estudos para Maratonas de Prog. Paralela – GEMPP
● Trabalho de Conclusão de Curso
7
Objetivos deste Mini-Curso
● Programação Paralela
● Técnicas de Programação Paralela com OpenMP
● Teoria
● Prática
● Desafios Futuros para a área de PPD
8
Roteiro
● Evolução dos Microprocessadores
● Cenário Atual
● Programar Paralelo, Porque? Onde? Como?
● OpenMP:
● Noções Básicas
● Paralelismo de Laços
● Paralelismo de Seções
● Diretivas de Sincronização
● Desafios Futuros
10
Evolução dos Microprocessadores
Sobreposição na execução de etapas da instrução
IF ID EX ME WBIF ID EX ME WB
IF ID EX ME WB
12
Evolução dos Microprocessadores
Melhora do desempenho utilizando técnicas de computação paralela!
15
Arquiteturas Multi-Core
● De forma simplificada um processador multi-core é colocar dois ou mais processadores num mesmo processador/chip.
● Trabalho de processsamento ficará dividido entre os cores.
CPU 0 CPU 1
16
Arquiteturas Multi-Core
● De forma simplificada um processador multi-core é colocar dois ou mais processadores num mesmo processador/chip.
● Trabalho de processsamento ficará dividido entre os cores.
CPU 0 CPU 1
17
Arquiteturas Multi-Core
● De forma simplificada um processador multi-core é colocar dois ou mais processadores num mesmo processador/chip.
● Trabalho de processsamento ficará dividido entre os cores.
CPU 0 CPU 1
18
Programação Paralela
“Programação Paralela é a capacidade de dividirmos
uma carga de trabalho entre vários processadores
dinamicamente e de forma eficiente!”
19
O que paralelizar?
● Previsão do tempo e do clima
● Cálculos matemáticos
● Processamento de imagens
● Simuladores
● Componentes de Jogos*
20
Porque Paralelizar?
● Processamento simultâneo de diversas tarefas
● Melhorar aproveitamento do hardware – ciclos ociosos
● Aumentar o desempenho da CPU
● Aplicações mais rápidas e eficientes – Redução do tempo de computação
22
Cenário Atual
Arquiteturas Multicore
Ferramentas
Motivos
Aplicações
Prós Contra
Pensamento e ProgramaçãoSequencial
24
Identificando Oportunidades de Paralelismo
● Estudar a aplicação:
● Tempo de execução● Ferramentas de geração de profile● Avaliar potênciais funções e loops
● Identificar tarefas que possam ser executadas concorrentemente
● Definir a maneira mais eficiente de paraleliza-lá
● Obter um código paralelo ideal pode levar horas, dias, semanas e até meses
25
1. Preparar a tinta = 30 s;
2. Pintar 300 estacas = 3000 s;
3. Aguardar tinta secar = 30 s;
Quanto tempo levará um pintor?
Exemplo
26
1. Preparar a tinta = 30 s;
2. Pintar 300 estacas = 3000 s;
3. Aguardar tinta secar = 30 s;
Quanto tempo levará um pintor?
Exemplo
3060 s
27
1. Preparar a tinta = 30 s;
2. Pintar 300 estacas = 3000 s;
3. Aguardar tinta secar = 30 s;
Quanto tempo levará um pintor?
Exemplo
3060 s
1530 s 1560 s
Quanto tempo levarão dois pintores?
28
1. Preparar a tinta = 30 s;
2. Pintar 300 estacas = 3000 s;
3. Aguardar tinta secar = 30 s;
Quanto tempo levará um pintor?
Exemplo
3060 s
1530 s 1560 s
Quanto tempo levarão dois pintores?
29
Exemplo
● Sempre existirão partes sequenciais em um programa!
1. Preparar a tinta
2. Pintar 300 estacas
3. Aguardar tinta secar
Região Paralela
Região Sequencial
Região Sequencial
30
Exemplo
● Sempre existirão partes sequenciais em um programa!
1. Preparar a tinta
2. Pintar 300 estacas
3. Aguardar tinta secar
Região Paralela
Região Sequencial
Região Sequencial
Pintar 150
Secar a tinta
Preparar a tinta
Pintar 150Pintar 300
Secar a tinta
Preparar a tinta
Tempo
Sequencial:
Tempo
Paralelo:
32
● Open Multi-Processing
● Teve início por volta de 1997
● Padrão que define como os compiladores devem gerar códigos paralelos através de diretivas e funções. (Não é linguagem!)
● Disponível para Fortran 77, Fortran 90, C e C++
● Baseia-se na criação de várias threads que compartilham o mesmo recurso de memória
● Regiões Privadas
● Regiões Compartilhadas
Noções Básicas de OpenMP
33
● Open Multi-Processing
● Teve início por volta de 1997
● Padrão que define como os compiladores devem gerar códigos paralelos através de diretivas e funções. (Não é linguagem!)
● Disponível para Fortran 77, Fortran 90, C e C++
● Baseia-se na criação de várias threads que compartilham o mesmo recurso de memória
● Regiões Privadas
● Regiões Compartilhadas
Noções Básicas de OpenMP
34
● Facilidade de conversão de programas seqüenciais em paralelos
● Fácil compreensão e uso das diretivas
● Minimiza a interferência na estrutura do algoritmo
● Compila e executa em ambientes paralelo e sequencial
● Maneira simples de explorar o paralelismo
Noções Básicas de OpenMP
35
● Facilidade de conversão de programas seqüenciais em paralelos
● Fácil compreensão e uso das diretivas
● Minimiza a interferência na estrutura do algoritmo
● Compila e executa em ambientes paralelo e sequencial
● Maneira simples de explorar o paralelismo
Noções Básicas de OpenMP
!!! CUIDADO !!!
OpenMP é simples, mas demanda conhecimento: - Aplicação - Arquitetura - Melhor “opção” de paralelismo
38
● Consiste em uma linha de código com significado especial para o compilador.
● Identificadas pelo #pragma omp
● Formato padrão:
#pragma omp nome_diretiva [cláusula,...] novaLinha
● Inclusão header: “omp.h”
Diretivas de Compilação
Construtor ParaleloConstrutores de Compartilhamento de Trabalho
Diretivas de Sincronização
39
● Diretiva mais importante do OpenMP
● Informa ao compilador a área que deverá ser executada em paralelo
Construtor Paralelo
#include <omp.h>int main(){
#pragma omp parallel{printf(“Ola Mundo\n”);
}}
if, private, shared, firstprivate, default,
copyin, reduction num_threads
40
● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/
● gcc nome_programa.c -o nome_saida -fopenmp
● hello.c e exemplo1.c
Construtor Paralelo
#include <omp.h>int main(){
#pragma omp parallel{
for(i=0;i<n;i++)a[i] = b[i]+c[i];
}}
41
● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/
● gcc nome_programa.c -o nome_saida -fopenmp
● hello.c e exemplo1.c
Construtor Paralelo
#include <omp.h>int main(){
#pragma omp parallel{
for(i=0;i<n;i++)a[i] = b[i]+c[i];
}}
O que há de errado com o código ao lado?
42
● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/
● gcc nome_programa.c -o nome_saida -fopenmp
● hello.c e exemplo1.c
Construtor Paralelo
#include <omp.h>int main(){
#pragma omp parallel{
for(i=0;i<n;i++)a[i] = b[i]+c[i];
}}
O que há de errado com o código ao lado?
Variáveis compartilhadas entre todas as
threads, por padrão!
43
● Exemplos:● www.inf.ufrgs.br/~aflorenzon/curso_OpenMP/
● gcc nome_programa.c -o nome_saida -fopenmp
● hello.c e exemplo1.c
Construtor Paralelo
#include <omp.h>int main(){
#pragma omp parallel private(i){
for(i=0;i<n;i++)a[i] = b[i]+c[i];
}}
Variáveis de controlede laço devem ser
privadas à cada thread!
44
● Construtor de Compartilhamento de Trabalho:
● Responsáveis pela distribuição de trabalho entre as threads e determinam como o trabalho será dividido entre as threads.
● Necessariamente interna a uma região paralela.
#pragma omp construtor[clausula [clausula] …]
– #pragma omp for
– #pragma omp sections
– #pragma omp single
Construtor Paralelo
45
● #pragma omp for
– Iterações dos laços for são executadas em paralelo.
– Número de iterações deve ser previamente conhecido e não possui variação durante a execução – (while).
– Implementa SIMD (Single Instruction Multiple Data).
Construtor de Trabalho
46
● #pragma omp for
– Iterações dos laços for são executadas em paralelo.
– Número de iterações deve ser previamente conhecido e não possui variação durante a execução – (while).
– Implementa SIMD (Single Instruction Multiple Data).
Construtor de Trabalho
#include <omp.h>int main(){
#pragma omp parallel private(i){ #pragma omp for
for(i=0;i<n;i++) a[i] = b[i]+c[i];
}}
Ex: ex_omp_for_1.c
47
● #pragma omp for
– Schedulers alteram a forma como as iterações do loop são distribuídas entre as threads
– #pragma omp for schedule (name_schedule, chunk)
– Guided, Dynamic, Static and Runtime
Construtor de Trabalho
48
● Cláusula schedule:
Construtores de Trabalho
Ex: ex_omp_for_static.c
ex_omp_for_dynamic.cex_omp_for_guided.c
49
Intervalo
● Nos vemos novamente as 21:00 hs para a segunda etapa do curso!
● OpenMP Sections
● Diretivas de Sincronização
● Desafios Futuros
● Considerações Finais
50
● #pragma omp sections
– Utilizado para dividir tarefas entre as threads em blocos de códigos que não possuem iterações.
Construtor de Trabalho
#include <omp.h>int main(){
#pragma omp parallel {
#pragma omp sections{
#pragma omp sectioninstrução
#pragma omp sectioninstruçao
}}
}
51
● #pragma omp sections
– Utilizado para dividir tarefas entre as threads em blocos de códigos que não possuem iterações.
Construtor de Trabalho
#include <omp.h>int main(){
#pragma omp parallel {
#pragma omp sections{
#pragma omp sectioninstrução
#pragma omp sectioninstruçao
}}
}
Região paralela
Indica que cada thread irá executar um bloco
de instruções diferentes
Qual instrução que cadathread irá executar
Fim região paralela
52
● #pragma omp sections
– Manter coerência entre número de blocos x número de threads– Mais blocos → algumas threads irão executar mais de um bloco– Mais threads → algumas threads ficarão ociosas– Apenas uma thread → execução seqüencial– Implementa MIMD (Multiple Instructions Multiple Data)
Construtor de Trabalho
Serial Paralelo
53
● #pragma omp sections
Construtor de Trabalho
#include <omp.h>int main(){
#pragma omp parallel {
#pragma omp sections{
#pragma omp sectionsoma_vet(a,b,c);
#pragma omp sectionmult_vet(a,b,d);
#pragma omp sectiondiv_vet(a,b,e);
#pragma omp sectionsub_vet(a,b,f);
}}
}
Ex1: ex_omp_sections.cEx1: ex_omp_sections.c
54
● #pragma omp sections
Construtor de Trabalho
#include <omp.h>int main(){
#pragma omp parallel {
#pragma omp sections{
#pragma omp sectionsoma_vet(a,b,c);
#pragma omp sectionmult_vet(a,b,d);
#pragma omp sectiondiv_vet(a,b,e);
#pragma omp sectionsub_vet(a,b,f);
}}
}
Ex1: ex_omp_sections.cEx1: ex_omp_sections.c
Ex1: ex_omp_sections.cEx2: ex_omp_sections_2.c./ex_omp_sections_2 numero_threads
Ex1: ex_omp_sections.comp_set_num_threads(NUM)
55
● #pragma omp single
● Trecho de código será executado apenas por uma thread
● Demais threads aguardam em uma barreira implícita
Construtor de Trabalho
#include <omp.h>int main(){
#pragma omp parallel {
#pragma omp singleprintf(“Inicio região paralela\n”);
#pragma omp for…
}}
56
● Primeiro devemos entender o que são “condições de corrida”
● Quando duas ou mais threads tentam atualizar, ao mesmo tempo, uma mesma variável
● Quando uma thread atualiza uma variável e outra acesso o valor ao mesmo tempo
● Quando isto acontece, o resultado tende a ser incorreto!
Diretivas de Sincronização
57
● Primeiro devemos entender o que são “condições de corrida”
● Quando duas ou mais threads tentam atualizar, ao mesmo tempo, uma mesma variável
● Quando uma thread atualiza uma variável e outra acesso o valor ao mesmo tempo
● Quando isto acontece, o resultado tende a ser incorreto!
Diretivas de Sincronização
Diretivas de sincronização garantem que o acesso ou atualização de uma determinada variável
Compartilhada aconteça no momento certo
58
● Construtores:
● Critical:
– Restringe a execução de uma determinada tarefa a apenas uma thread por vez
● Atomic
● Barrier
Diretivas de Sincronização
59
● Construtores:
● Critical:
– Restringe a execução de uma determinada tarefa a apenas uma thread por vez
● Atomic:
– Um local específico da memória deve ser atualizado atomicamente, ao invés de deixar várias threads tentarem escrever nele
– Em essência, esta directiva prevê uma seção mini-critical.
● Barrier
Diretivas de Sincronização
60
● Construtores:
● Critical
● Atomic
● Barrier:
– Utilizada para sincronizar todas as threads em um determinado ponto do código
Diretivas de Sincronização
61
● Classificadas em:
● Funções de ambiente de execução
● Funções de bloqueio
● Funções de tempo
Funções de Interface
62
● Paralelismo utilizando tasks!
● Utilizado para paralelizar algoritmos irregulares:
● Recursividade
● Repetições utilizando While
● Exemplos de aplicações:
● Algoritmos de ordenação → Merge sort, Quick sort...
● Manipulação de ponteiros → Listas
OpenMP Avançado
63
● #pragma omp task
● Interna a uma região paralela
● Thread que executar o #pragma omp task criará uma nova task
OpenMP Avançado
#include <omp.h>int main(){
#pragma omp parallel {
#pragma omp single nowaitsort();
}}
void sort(){….for(i=0;i<N;i++){
#pragma omp tasksort();
}}
64
● Poderosa API de programação paralela
● Fácil implementação
● Pouca modificação do código sequencial
● Bastante utilizada para computação hibrida (MPI + OpenMP)
Resumo OpenMP
67
● Eficiência Energética
● Aumentar/Manter desempenho
● Diminuir o consumo de energia
● Arquiteturas Heterogêneas
Desafios Futuros
68
● Eficiência Energética
● Aumentar/Manter desempenho
● Diminuir o consumo de energia
● Arquiteturas Heterogêneas
Desafios Futuros