OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

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

Programação em Paralelo OpenMP

Introdução OpenMP. Nielsen Castelo Damasceno

Sistemas Distribuídos e Paralelos

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

OpenMP: Variáveis de Ambiente

OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

Introdução ao OpenMP

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

Introdução ao OpenMP

OpenMP. Aleardo Manacero Jr.

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

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

OpenMP. Adaptado do Material do Calebe de Paula Bianchini

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

Jorge Barbosa, FEUP-DEI 2008

OpenMP: Variáveis de Ambiente

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

Construtores de Sicronização em OpenMP

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

OpenMP: Uma Introdução

Paralelismo em Computadores com Tecnologia Multicore

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

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

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

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

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

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

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

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

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

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

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

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

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

Programação em Memória Compartilhada com OpenMP

Open Multi-Processing - OpenMP Papers and Abstracts

Introdução ao OpenMP

Processos Concorrentes

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

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

Introdução à linguagem C

Ferramentas para Programação em Processadores Multi-Core

CAP-387(2016) Tópicos Especiais em

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

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

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

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

Aula 3 Constantes e funções de E/S

Programação Paralela e Distribuída - OpenMP

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

Programação Básica. Estrutura de um algoritmo

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

Introdução a classes e objetos. Copyright 2006 by Pearson Education

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

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Universidade Federal do Rio de Janeiro Informática DCC/IM. Arquitetura de Computadores II. Arquiteturas MIMD. Arquiteturas MIMD

Linguagem de Programação III

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

Intel Thread Building Blocks (TBB)

Fundamentos de Sistemas Operacionais

Estrutura de Programas e Tipos de Dados Simples

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

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

INTRODUÇÃO À LINGUAGEM C

INE5645-Programação Paralela e Distribuída Aula 17/09/2018 Nome

OpenMP. Um método de paralelização para as linguagens Fortran, C, C++ para shared memory systems.

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

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

Programação Estruturada

Desenvolvendo Aplicações OpenMP

Linguagem de Programação. Thiago Leite Francisco Barretto

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

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

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

Sistemas Operacionais

Programação: Vetores

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

Programação I A Linguagem C. Prof. Carlos Alberto

Aula 1 Apresentação do Curso

Puca Huachi Vaz Penna

Memórias Cache em Arquiteturas Multiprocessador e Multicore

Programação Concorrente e Paralela. Noemi Rodriguez

Elementos de conexão e condições de paralelismo. Aleardo Manacero Jr.

Computadores e Programação (DCC/UFRJ)

3. Linguagem de Programação C

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

Modularidade - Funções e Procedimentos

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

INTRODUÇÃO À LINGUAGEM C

Introdução à linguagem C++

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

LINGUAGEM DE PROGRAMAÇÃO C AULA 2. Professor: Rodrigo Rocha

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

Capítulo 11 Estudo de Caso 2: Windows 2000

SERVIÇO PÚBLICO FEDERAL MINISTÉRIO DA EDUCAÇÃO E DO DESPORTO CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS CEFET-MG UNIDADE DE ENSINO

Transcrição:

OpenMP Slides baseados em tutorial de Tim Mattson da Intel

O que é OpenMP? Uma especificação para um conjunto de diretivas de compilação, rotinas de biblioteca e variáveis de sistema que podem ser utilizadas para especificar paralelismo baseado em memória compartilhada Portável, incluindo plataformas Unix e Windows NT Disponível em implementações Fortran e C/C++ Definida e endossada por um grupo grande de fabricantes de software e hardware Suporta paralelismo de granulosidade fina e grossa

Origens No início dos anos 90, fabricantes de máquinas com memória compartilhada forneciam extensões para programação paralela em Fortran As implementações permitiam ao usuário inserir diretivas para indicar onde loops deveriam ser paralelizados e os compiladores eram responsáveis pela paralelização Implementações funcionalmente parecidas, mas não portáveis e começaram a divergir AINSI X3H5 em 1994 foi a primeira tentativa de padronização

Origens A especificação padrão OpenMP começou em 1997 partindo do padrão X3H5 graças ao aparecimento de novas arquiteturas de máquinas de memória compartilhada Alguns parceiros na especificação: Compaq, HP, Intel, IBM, Silicon, Sun Absoft, GENIAS, Myrias, The Portland Group ANSYS, Dash, ILOG CPLEX, Livermore, NAG A API para Fortran foi liberada em Outubro de 1997 e para C/C++ no final de 1997 Última versão OpenMP 5.0 (Novembro 2018)

Objetivos Prover um padrão para uma variedade de plataformas e arquiteturas baseadas em memória compartilhada Estabelecer um conjunto limitado e simples de diretivas para programação utilizando memória compartilhada Prover capacidade para paralelizar um programa de forma incremental Implementar paralelismo com granulosidade fina e grossa Suportar Fortran, C e C++

Modelo de programação Paralelismo baseado em threads: Se baseia na existência de processos consistindo de várias threads Paralelismo explícito: Modelo de programação explícito e não automático, permitindo total controle da paralelização ao programador Modelo fork-join Os programas OpenMP começam como um único processo denominado master thread, que executa seqüencialmente até encontrar a primeira construção para uma região paralela FORK: a master thread cria um time de threads paralelos As instruções que estão dentro da construção da região paralela são executadas em paralelo pelas diversas threads do time JOIN: quando as threads finalizam a execução das instruções dentro da região paralela, elas sincronizam e terminam, ficando somente ativa a master thread

OpenMP Basic Defs: SolutionEnd Stack User Application Directives, Compiler OpenMP library Environment variables OpenMP Runtime library OS/system support for shared memory and threading Proc1 Proc 2 Proc 3 Shared Address Space ProcN

Modelo de programação Baseado em diretivas de compilação: o paralelismo é especificado através do uso de diretivas para o compilador que são inseridas em um código Fortran ou C/C++ Suporte a paralelismo aninhado: construções paralelas podem ser colocadas dentro de construções paralelas e as implementações podem ou não suportar essa característica Threads dinâmicas: o número de threads a serem utilizadas para executar um região paralela pode ser dinamicamente alterado

Exercício 1: Hello World (uma thread) void main ( ) { int ID = 0; printf( hello(%d), ID); printf( world(%d)\n,id); }

Diretivas C/C++ Formato #pragma omp nome da diretiva [cláusula,...] newline Necessária para todas as diretivas Uma diretiva válida que deve aparecer depois da pragma e antes das cláusulas Opcional. Podem aparecer em qualquer ordem e repetidas quando necessário Necessária. Deve ser inserido após o bloco estruturado que está dentro da diretiva. Exemplo: #pragma omp parallel default(shared) private(beta,pi) Seguem o padrão de diretivas de compilação para C/C++ Cada diretiva se aplica no máximo a próxima instrução, que deve ser um bloco estruturado

Construtor de região PARALLEL Fork-join Quando uma thread chega na região paralela, ela cria um time de threads e se torna a mestre do time. Ela faz parte do time e tem o número 0. O código que começa no início da região paralela é duplicado e todas as threads o executam Existe uma barreira implícita no final da seção paralela, e somente o mestre continua a executar após esse ponto O número de threads na região paralela é definido por: Uso da rotina omp_set_num_threads () Na diretiva #pragma omp parallel num_threads () Uso da variável de ambiente OMP_NUM_THREADS Default da implementação

Exercício 1: Hello World (multithreaded) #include <omp.h> void main ( ) { #pragma omp parallel { int ID = 0; printf( hello(%d), ID); printf( world(%d)\n,id); } } Final da região paralela Arquivo header OpenMP Início da região paralela com número default de threads

Exercício 1: Hello World (multithreaded) #include <omp.h> void main ( ) { #pragma omp parallel Opções para compilação e { ligação gcc -fopenmp int ID = 0; printf( hello(%d), ID); printf( world(%d)\n,id); }

Exercício 1: Hello World (multithreaded) Cada thread imprime seu número: #include <omp.h> void main ( ) { #pragma omp parallel Rotina da biblioteca para { obter número da thread int ID = omp_get_thread_num(); printf( hello(%d), ID); printf( world(%d)\n,id); }

Criação de threads Para criar 4 threads na região paralela: double A[1000] omp_set_num_threads(4) #pragma omp parallel { int ID = omp_get_thread_num(); fa(a,id); } Cada thread executa uma cópia do código que está no bloco estruturado

Criação de threads Para criar 4 threads na região paralela: double A[1000] #pragma omp parallel num_threads(4) { int ID = omp_get_thread_num(); fa(a,id); } Cada thread executa uma cópia do código que está no bloco estruturado

Criação de threads double A[1000] Uma cópia de A é compartilhada entre as threads omp_set_num_threads(4) fa(0,a) fa(1,a) fa(2,a) fa(3,a) Todas as threads esperam aqui para continuar

Integração numérica 4.0 Matematicamente, sabemos que: 1 2.0 0 4.0 (1+x 2 ) dx = Podemos aproximar a integral por uma soma de retângulos: 0.0 X 1.0 N F(x i ) x i = 0 Onde cada retângulo tem largura x e altura F(x ) no meio do intervalo i

Programa sequencial Pi static long num_steps = 100000; double step; void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; for (i=0;i< num_steps; i++){ x = (i+0.5)*step; sum = sum + 4.0/(1.0+x*x); } pi = step * sum; }

Programa paralelo Pi Crie uma versão paralela do programa Pi usando uma construção paralela Divida o número de steps entre as threads Crie um vetor compartilhado para armazenar as somas parciais Utilize as rotinas: omp_set_num_threads omp_get_thread_num omp_get_num_threads

Programa paralelo Pi