Programação em Paralelo OpenMP

Documentos relacionados
Introdução ao OpenMP

OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

Bibliografia. OpenMP. Disponibilidade de OpenMP. Abordagem SPMD. Nicolas Maillard

SSC 0742 PROGRAMAÇÃO CONCORRENTE. Aula 08 Ferramentas de Apoio ao Desenvolvimento de Aplicações Concorrentes OpenMP Prof.

Introdução ao OpenMP

for(int x=0; x < width; x++) { for(int y=0; y < height; y++) { finalimage[x][y]=renderpixel(x,y, &scenedata); } }

Agenda. O que é OpenMP? Regiões Paralelas Construtores para Compartilhamento de

Paralelismo em Computadores com Tecnologia Multicore

OpenMP. Adaptado do Material do Calebe de Paula Bianchini

Sistemas Distribuídos e Paralelos

Introdução OpenMP. Nielsen Castelo Damasceno

OpenMP: Variáveis de Ambiente

Construtores de Sicronização em OpenMP

Matheus S. Serpa, Vinícius G. Pinto, Philippe O. A. Navaux Contato: INTEL MODERN CODE PARTNER

OpenMP: Variáveis de Ambiente

Variáveis em OpenMP. Esbel Tomás Valero Orellana

Para saber se o pacote está disponível nos repositórios, abra um terminal e digite (use o comando abaixo):

OpenMP. Aleardo Manacero Jr.

PROGRAMAÇÃO. Programação paralela com o OpenMP Em paralelo

Programação em Memória Partilhada com o OpenMP

OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

Introdução à OpenMP (Dia 1) Prof. Guido Araujo

Paralela e Distribuída. Memória Paralela com o OpenMP

Open Multi-Processing - OpenMP Papers and Abstracts

Paralela e Distribuída. com o MPI e o OpenMP

Programação Paralela e Distribuída - OpenMP

Jorge Barbosa, FEUP-DEI 2008

ÍNDICE PARTE I INTRODUÇÃO... 6

Paradigmas de Computação Paralela (UCE Computação Paralela Distribuída)

OpenMP. Mestrado em Ciência da Computação Introdução ao Processamento Paralelo e Distribuído Prof. Dr. Adenauer Corrêa Yamin Mestranda: Nelsi Warken

OpenMP: Uma Introdução

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017. ALUNO Prof. Bosco

Introdução ao OpenMP

INE5645 PROGRAMAÇAO PARALELA E DISTRIBUÍDA PROVA 1 18/09/2017 ALUNO: Prof. Bosco

Introdução à Programação Paralela com OpenMP: Além das Diretivas de Compilação

Técnicas de Processamento Paralelo na Geração do Fractal de Mandelbrot

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

AULA 06: PROGRAMAÇÃO EM MÁQUINAS PARALELAS

Memórias Cache em Arquiteturas Multiprocessador e Multicore

UM ESTUDO COMPARATIVO DE DESEMPENHO UTILIZANDO PROGRAMAÇÃO SEQUENCIAL VS PARALELA APLICADO EM ALGORITMOS GENÉTICOS 1

Programação em Memória Compartilhada com OpenMP

CAP-387(2016) Tópicos Especiais em

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

Programação de Alto Desempenho - 2. Prof: Carla Osthoff

Paralela e Distribuída. Memórias Cache e Arquitecturas Multi-Processador

Monografia. Análise Comparativa de Desempenho de um algoritmo Paralelo implementado nas Linguagens de Programação CPAR e OpenMP

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Laboratório de Programação Paralela. Introdução. Prof. Carlos Bazilio

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Introdução à programação paralela em Fortran usando OpenMP e MPI

Intel Thread Building Blocks (TBB)

Linguagem Chapel. Walter Perez Urcia. Universidade de São Paulo Instituto de Matemática e Estadística Departamento de Ciências da Computação

Processamento Paralelo Utilizando GPU

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

ANÁLISE DE DESEMPENHO COM A PARALELIZAÇÃO DO CÁLCULO DE NÚMEROS PERFEITOS 1

Ferramentas para Programação em Processadores Multi-Core

SSC PROGRAMAÇÃO CONCORRENTE. Aula 06 Modelos de Programação Prof. Jó Ueyama e Julio Cezar Estrella

COMPARAÇÃO DE DESEMPENHO ENTRE IMPLEMENTAÇÕES DO ALGORITMO JOGO DA VIDA COM PTHREAD E OPEMMP 1

Programação Paralela. Introdução

Desenvolvendo Aplicações OpenMP

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Aluno de Pós-Graduação em Engenharia de Software para Dispositivos Móveis pela UNINTER

Apostila de Introdução ao OpenMP

Paralelismo de dados. (execução de simultaneidade) Tipo de arquitetura paralela SIMD. SIMD (Single Instruction Multiple Data)

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Sistemas Operacionais Prof. Fabrício Sérgio de Paula

Programação Paralela e Distribuída (DCC/UFRJ)

Ferramentas para Programação em Processadores Multi-Core

Paralelização Introdução a vetorização, OpenMP e MPI

Introdução aos Conceitos de Computação Paralela através da estimativa de Pi

Linguagem C Princípios Básicos (parte 1)

Sistemas Operacionais

Sistemas Operacionais

Fundamentos de Sistemas Operacionais

Paradigmas de Processamento Paralelo na Resolução do Fractal de Mandelbrot

Programação Estruturada I

Sparse Matrix-Vector Multiplication on GPU: When Is Rows Reordering Worthwhile?

XV ESCOLA REGIONAL DE ALTO DESEMPENHO ERAD 2015

Programação em Paralelo. N. Cardoso & P. Bicudo. Física Computacional - MEFT 2010/2011

O Modelo Síncrono BSP para Computação Paralela

13 a Aula - Instruções Condicionais. Ciclos. Pré-processador. Variáveis de ambiente. Mestrado em Engenharia Física Tecnológica

Introdução ao CUDA. Material elaborado por Davi Conte.

Programação em Paralelo. N. Cardoso & P. Bicudo. Física Computacional - MEFT 2010/2011

ERAD SP IV Escola Regional de Alto Desempenho de São Paulo. Programando para múltiplos processadores: Pthreads, OpenMP e MPI.

Básico: estrutura de programa, sintaxe Interface com linha de comando

Fabrício Gomes Vilasbôas

Message Passing Interface - MPI. Jorge Barbosa

ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES II AULA 07: PROGRAMANDO COM THREADS EM LINGUAGEM C

Programação de Computadores II

Conversão de algoritmos de processamento e análise de dados atmosféricos da linguagem C para CUDA

Paradigmas de Computação Paralela

Paralelização de Algoritmos de CFD em Clusters Multi-Core MC7. Escola de Verão Arquiteturas Multi-Core

Threads. Nuno Ferreira Neves Faculdade de Ciências de Universidade de Lisboa. Fernando Ramos, Nuno Neves, Sistemas Operativos,

Distâncias entre vértces em um grafo. Paralelização. André de Freitas Smaira

5 Unidades de Processamento Gráfico GPUs

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 13/11/2017 ALUNO

StarPU. Edênis Freindorfer Azevedo. 10 de junho de Instituto de Matemática e Estatística

INF1339 Computação Gráfica Tridimensional. Waldemar Celes. 2 de Agosto de 2010

Computação Paralela (CUDA)

Programação Concorrente e Paralela

Transcrição:

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

Introdução Potencial do GPU vs CPU Cálculo: 367 GFLOPS vs. 32 GFLOPS Largura de banda da memória: 86.4 GB/s vs. 8.4 GB/s GPU em todos os PCs e workstations Paralelização em CPUs Pthreads OpenMP MPI... Paralelização em GPUs CUDA OpenCL... N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 2 / 15

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

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

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 partilhada sobretudo paralelismo nos dados Constituída por: directivas de compilação bibliotecas de funções variáveis de ambiente Portátil versões para C/C++ e Fortran implementação para UNIX/Linux e Windows Objectivo - obter um standard de programação apoiado pelos grandes fabricantes de software e hardware N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 5 / 15

Modelo de Programação do OpenMP Paralelismo explícito Modelo de memória partilhada baseado em threads trabalho é dividido por threads de execução variáveis podem ser partilhadas por todos os threads duplicadas (privadas) para cada thread threads comunicam através das variáveis partilhadas Usar sincronização para evitar competição entre threads OpenMP Modelo de Execução Modelo de execução tipo "fork-join" Modelo de execução tipo fork join inicia execução com um processo (master thread) inicia execução com um processo (master thread) no início do construtor paralelo cria um team-of-threads no início do construtor paralelo cria um team of threads ao completar team-of-threads sincroniza numa barreira implícita ao completar o team of threads sincroniza numa barreira apenas o master continua em execução implícita apenas o master continua a execução Fernando Silva DCC FCUP 7 N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 6 / 15

Modelo de Programação do OpenMP OPENMP controlo de estruturas paralelas (directivas) distribuição de tarefas (directivas) variáveis (clausulas) sincronização (directivas) variáveis runtime e de ambiente parallel for parallel for section shared private... critical atomic barrier... omp_set_num_threads() omp_get_num_threads() OMP_NUM_THREADS OMP_SCHEDULE.... O número de threads na região paralela é determinado pelos seguintes factores (ordem de precedência): cláusula num_threads(int) função omp_set_num_threads() variável ambiente OMP_NUM_THREADS default - 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 de threads para cada região, a menos que seja redefinido N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 7 / 15

OpenMP: Directivas C/C++ #pragma omp directive-name [clause,...] newline directive-name uma directiva OpenMP válida. Tem de aparecer depois do pragma e antes das cláusulas [clause,...] Opcional. Podem aparecer em qualquer ordem e se necessário repetidas. newline Obrigató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 l p r i n t f ( " Hello World \ n " ) ; return 0; } Compilar em Linux: gcc -o exemplo exemplo.c -fopenmp 1 processador Hello World 4 processadores Hello World Hello World Hello World Hello World N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 8 / 15

Cláusulas OpenMP #pragma omp parallel clause bloco_codigo(); As cláusulas possibilitam ao utilizador o controlo do âmbito das variáveis na região paralela. private(list) as variáveis da lista ficam privadas a cada thread do team nã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 threads por 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 a execução será sequencial. N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 9 / 15

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 ) malloc ( n sizeof ( i n t ) ) ; for ( i =0; i < n ; i ++) a [ i ] = i ; #pragma omp p a r a l l e l num_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 for ( i =0; i < n ; i ++) sum += a [ i ] ; p r i n t f ( " Sum = %d \ n ",sum ) ; Qual é o problema no código? N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 10 / 15

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 ) malloc ( n sizeof ( i n t ) ) ; for ( i =0; i < n ; i ++) a [ i ] = i ; #pragma omp p a r a l l e l num_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 for ( 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

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 ) malloc ( n sizeof ( i n t ) ) ; for ( i =0; i < n ; i ++) a [ i ] = i ; #pragma omp p a r a l l e l num_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

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 ) malloc ( n sizeof ( i n t ) ) ; for ( i =0; i < n ; i ++) a [ i ] = i ; #pragma omp p a r a l l e l num_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 ) malloc ( 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 for for ( 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

Exemplo: Sections main ( ) { #pragma omp p a r a l l e l { #pragma omp section Task1 ( ) ; #pragma omp section Task2 ( ) ; #pragma omp section Task3 ( ) ; #pragma omp section Task4 ( ) ; } } sections 1 processador executa as tasks de forma sequencial 4 processadores uma task para cada processador N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 13 / 15

Construtores de Sincronização omp master especifica uma região que será executada apenas pelo master (os outros ignoram) omp critical especifica uma região crítica de código que deve ser executada apenas por um thread de cada vez. omp barrier quando esta directiva é alcançada por um thread, este espera até que os restantes cheguem ao mesmo ponto. omp atomic especifica um endereço de memória para actualização atómica. omp flush identifica um ponto de sincronização no qual é necessário providenciar uma visão consistente da memória. omp ordered especifica que as iterações devem ser executadas pela mesma ordem, como se fossem executadas sequencialmente. N. Cardoso & P. Bicudo Programação em Paralelo: OpenMP 14 / 15

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 lock void omp_unset_lock(omp_lock_t*) liberta o lock double 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