Introdução ao OpenMP

Documentos relacionados
Programação em Paralelo OpenMP

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

OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

Open Multi-Processing - OpenMP Papers and Abstracts

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

OpenMP. Adaptado do Material do Calebe de Paula Bianchini

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

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

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

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

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

OpenMP. Aleardo Manacero Jr.

Introdução ao OpenMP

OpenMP: Variáveis de Ambiente

OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

Sistemas Distribuídos e Paralelos

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

Paralelismo em Computadores com Tecnologia Multicore

Introdução ao OpenMP

Introdução OpenMP. Nielsen Castelo Damasceno

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

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

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

Programação Paralela e Distribuída - OpenMP

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

Construtores de Sicronização em OpenMP

Memórias Cache em Arquiteturas Multiprocessador e Multicore

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

Jorge Barbosa, FEUP-DEI 2008

OpenMP: Variáveis de Ambiente

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

Desenvolvendo Aplicações OpenMP

OpenMP: Uma Introdução

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

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

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

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

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

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

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

Apostila de Introdução ao OpenMP

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

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

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

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

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

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

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

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

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

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

Programação Paralela. Introdução

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

Programação em Memória Compartilhada com OpenMP

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

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

OPENMP AULA 01. Slides baseados no material de Tim Mattson - Intel Corp. (2010) A Hands-on Introduction to OpenMP * INTEL MODERN CODE PARTNER 1

Laboratório de Introdução à Ciência da Computação I

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

Agendamento para Sistemas Paralelos

Controlo de Execução. K&R: Capitulo 3

Programação Paralela: Sistemas Multicore

Programação Estruturada

Introdução à Programação em C

Algoritmos e Programação

Laboratório de Introdução à Ciência da Computação I

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

Ponteiros e Tabelas. K&R: Capítulo 5

Sistemas Operacionais

Intel Modern Code: Programação Paralela e Vetorial AVX para o Processador Intel Xeon Phi Knights Landing 1

Linguagem de Programação C

CAP-387(2016) Tópicos Especiais em

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

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Linguagem C (continuação)

Message Passing Interface - MPI

Linguagem de Programação C. Linguagem de Programação C. Linguagem de Programação C. Linguagem de Programação C. Linguagem de Programação C

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Linguagem C: Introdução

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

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

Introdução à linguagem C++

Linguagem de Programação III

Message Passing Interface - MPI. Jorge Barbosa

Programação: Vetores

Programação de Computadores II

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

Intel Thread Building Blocks (TBB)

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

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

Carlos Eduardo Batista. Centro de Informática - UFPB

Programação Concorrente e Paralela

ESTRUTURAS CONDICIONAIS. Introdução à Ciência da ComputaçãoI Simone Senger de Souza

Laboratório de Introdução à Ciência da Computação I

Introdução à Programação I

Algoritmos e Estruturas de Dados I (DCC/003) Funções

Transcrição:

Introdução ao OpenMP Fernando Silva DCC FCUP Recursos OpenMP.org (http://www.openmp.org) Tutorial (http://www.llnl.gov/computing/tutorials/openmp/) Implementação gratuita Omni OpenMP compiler project (http://phase.hpcc.jp/omni/) Fernando Silva DCC FCUP 2

O que é o OpenMP? API para programação paralela explícita paralelismo em memória partilhada sobretudo paralelismo nos dados Constituída por: directivas de compilação, biblioteca de funções, e variáveis de ambiente Objectivo obter um standard de programação apoiado pelos grandes fabricantes de software e hardware Fernando Silva DCC FCUP 3 O que é o OpenMP (cont.)? Portável versões para C/C++ (ver. 1.0 em 1998) e Fortran (versão 1.0 em 1997) implementações para UNIX/Linux e Windows Significado: Open specifications for Multi Processing via collaborative work from software/hardware industry, academia and government Fernando Silva DCC FCUP 4

Um Programa Simples em OpenMP Directivas de compilação ou pragmas identificam pontos e formas de paralelização Ênfase na paralelização de ciclos Programa sequencial void main() { double r[1000]; Programa paralelo void main() { double r[1000]; for (int i=0; i<1000; i++) { large_computation(r[i]); #pragma omp parallel for for (int i=0; i<1000; i++) { large_computation(r[i]); Fernando Silva DCC FCUP 5 Modelo de Programação do OpenMP Paralelismo explícito anotações feitas pelo programador 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 Fernando Silva DCC FCUP 6

OpenMP Modelo de Execução Modelo de execução tipo fork join inicia execução com um processo (master thread) no início do construtor paralelo cria um team of threads ao completar o team of threads sincroniza numa barreira implícita apenas o master continua a execução Fernando Silva DCC FCUP 7 C/C++ Estrutura Geral do Código #include <omp.h> main() { int var1, var2, var3; parte_sequencial_1(); #pragma omp parallel private(var1,var2) shared(var3) { parte_paralela(); // executada pelos threads... // Todos os threads fazem o join com o master e terminam parte_sequencial_2(); Fernando Silva DCC FCUP 8

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 claúsulas [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. Exemplo: #pragma omp parallel default(shared) private(beta,pi) Fernando Silva DCC FCUP 9 Compilação Condicional: _OPENMP #ifdef _OPENMP bloco_código; #endif Exemplo de código: printf( %d processadores livres\n, omp_get_num_procs()); Possibilita instrumentalizar o código Fernando Silva DCC FCUP 10

Syntax parallel #pragma omp parallel clause bloco_código; Indica que o bloco_código é para ser executado em paralelo. onde clause pode ser: if(exp) private(list) firstprivate(list) num_threads(int_exp) shared(list) default(shared none) copyin(list) reduction(operator: list) Fernando Silva DCC FCUP 11 Claúsulas OpenMP As claúsulas private, shared, default e firstprivate 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 incializadas 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 Fernando Silva DCC FCUP 12

Quantos threads? O número de threads na região paralela é determinado pelos seguintes factores (ordem de precedência): claúsula 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 várias regiões em paralelo usará o mesmo número de threads para cada região, a menos que redefina como explicado. Fernando Silva DCC FCUP 13 Outras Claúsulas: reduction, copyin e if reduction (operador:lista) 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. Fernando Silva DCC FCUP 14

Programa Hello! #include <omp.h> main () { int nthreads, tid; // Fork team threads, cada uma cópia das variáveis. #pragma omp parallel private(nthreads, tid) { // Obtem e escreve thread id tid = omp_get_thread_num(); printf("hello World from thread = %d\n", tid); // apenas o master thread faz isto if (tid == 0){ nthreads = omp_get_num_threads(); printf("number of threads = %d\n", nthreads); /* Todos os theards juntam se no master Fernando Silva DCC FCUP 15 Constructores de work sharing Especificam regras de divisão de trabalho entre os threads, não cria os threads! Tipos de partilha: for partilha as iterações de um ciclo pelos threads da team (data paralelism). sections divide o trabalho em secções discretas, distintas, que são executadas pelos threads. Pode ser usado para paralelismo funcional. single serializa o código Fernando Silva DCC FCUP 16

Syntax for #pragma omp for clause { ciclo_for(); onde clause pode ser: private(list) firstprivate(list) lastprivate(list) reduction(operator: list) ordered schedule(type) Nowait O compilador distribui as iterações pelos threads Fernando Silva DCC FCUP 17 Exemplo for Fernando Silva DCC FCUP 18

Claúsulas schedule como dividir as iterações do ciclo pelos threads. static as iterações são agrupadas em conjuntos (chunks), estaticamente atribuídos aos threads. dynamic as iterações sõa agrupadas em bocados (chunks) e são dinamicamente distribuídos pelos threads; quando um termina, recebe dinamicamente outro chunk. guided indica o número mínimo de iterações a agrupar numa tarefa; runtime a decisão é tomada em tempo de execução a partir da var. OMP_SCHEDULE Fernando Silva DCC FCUP 19 Exemplo do uso da directiva for #include <omp.h> #define CHUNKSIZE 100 #define N 1000 main() { int i, chunk; float a[n], b[n], c[n]; /* Algumas inicializacoes */ for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; chunk = CHUNKSIZE; #pragma omp parallel shared(a,b,c,chunk) private(i) { #pragma omp for schedule(dynamic,chunk) nowait for (i=0; i < N; i++) c[i] = a[i] + b[i]; // fim da secção paralela/ Fernando Silva DCC FCUP 20

Exemplo sections Fernando Silva DCC FCUP 21 Syntax sections #pragma omp sections clause { #pragma omp section newline código(); #pragma omp section newline código(); ; onde clause pode ser: private(list) firstprivate(list) lastprivate(list) reduction(operator: list) nowait Fernando Silva DCC FCUP 22

Exemplo sections #include <omp.h> #define N 1000 main() { int i, chunk; float a[n], b[n], c[n]; // Some initializations for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; #pragma omp parallel shared(a,b,c) private(i) { #pragma omp sections nowait { #pragma omp section for (i=0; i < N/2; i++) c[i] = a[i] + b[i]; #pragma omp section for (i=n/2; i < N; i++) c[i] = a[i] + b[i]; // fim de secções Fernando Silva DCC FCUP 23 Constructores de Sincronização omp master especificar 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 restnates cheguem ao mesmo ponto. Fernando Silva DCC FCUP 24

Constructores de Sincronização (cont.) 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 seuqencialmente. Fernando Silva DCC FCUP 25 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 t-1) int omp_get_num_procs(void) retorna o número de processadores disponíveis para o programa Fernando Silva DCC FCUP 26

Funções OpenMP (cont) void omp_init_lock(omp_lock_t*) Inicializa um lock associado à variável de lock void omp_destroy_lock(omp_lock_t*) void omp_set_lock(omp_lock_t*) espera até 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 Fernando Silva DCC FCUP 27 Exemplo Redução #include <omp.h> #include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { int i, n; float a[100], b[100], sum; n = 100; /* Some initializations */ for (i=0; i < n; i++) a[i] = b[i] = i * 1.0; sum = 0.0; #pragma omp parallel for reduction(+:sum) for (i=0; i < n; i++) sum = sum + (a[i] * b[i]); printf(" Sum = %f\n",sum); Fernando Silva DCC FCUP 28

Exemplos funções OpenMP #include <omp.h> #include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]){ int nthreads, tid, procs, maxt, inpar, dynamic, nested; /* Start parallel region */ #pragma omp parallel private(nthreads, tid) { /* Obtain thread number */ tid = omp_get_thread_num(); /* Only master thread does this */ if (tid == 0) { printf("thread %d getting info...\n", tid); /* Get environment information */ procs = omp_get_num_procs(); nthreads = omp_get_num_threads(); maxt = omp_get_max_threads(); inpar = omp_in_parallel(); dynamic = omp_get_dynamic(); nested = omp_get_nested(); /* Print environment information */ printf("number of processors = %d\n", procs); printf("number of threads = %d\n", nthreads); printf("max threads = %d\n", maxt); printf("in parallel? = %d\n", inpar); printf("dynamic threads? = %d\n", dynamic); printf("nested parallelism? = %d\n", nested); /* Done */ Fernando Silva DCC FCUP 29