Introdução OpenMP Nielsen Castelo Damasceno
Computação de auto desempenho Processamento Paralelo Memória Distribuída e Compartilhada Modelo de programação OpenMP Métricas de Desempenho
Computação de auto desempenho O desenvolvimento científico tem exigido das simulações numéricas resultados cada vez mais confiáveis e próximos da realidade. A computação científica se depara com o desafio de superar as diversas barreiras que surgem em virtude da limitação física dos computadores.
Objetivo Tem como objetivo aumentar a velocidade de processamento de simulações numéricas e viabilizar a simulação de modelos muito grandes e/ou com elevado grau de detalhes.
Arquitetura distribuída
Arquitetura distribuída
Arquitetura distribuída
Arquitetura distribuída
Arquitetura distribuída
O que é OpenMP OpenMP é uma interface de programação (API), portável, baseada no modelo de programação paralela de memória compartilhada para arquiteturas de múltiplos processadores.
Modelo de programação Paralelismo baseado em Threads : Processo de memória compartilhada que consiste de múltiplos threads ; Paralelismo explícito: O OpenMP é um recurso de programação paralela que permite ao programador total controle sobre a paralelização do código;
Histórico No início da década de 90, fabricantes de máquinas de memória compartilhada e similar, desenvolveram extensões do compilador Fortran com um conjunto especial de instruções denominadas de diretivas de execução.
Histórico O primeiro padrão, ANSI X3H5, para testes foi lançado em 1994, mas nunca foi adotado devido ao grande uso e interesse, na época, por máquinas de memória distribuída (clusters). Um novo padrão foi desenvolvido em 1997 a partir do padrão anterior, quando as arquiteturas de memória compartilhada se tornaram mais comum.
Histórico Em 28 de Outubro de 1997 foi divulgado e disponibilizado o OpenMP Fortran API e no final de 1998 foi disponibilizado o OpenMP C/C++ API. Informações do OpenMP em http://www.openmp.org/
Modelo de execução
Modelo de execução Todos os programas OpenMP começam como um processo simples: Thread Mestre. O thread mestre executa sequencialmente até a primeira definição de uma região paralela ser encontrada. FORK (bifurcar): O thread mestre cria um conjunto ( team ) de threads paralelos.
Modelo de execução Os comandos de um programa que estão inseridos na região paralela serão executados em paralelo pelos diversos threads criados. JOIN (unir): Quando o conjunto de threads completar a execução dos comandos na região paralela, os threads são sincronizados e finalizados, permanecendo apenas o thread mestre.
Modelo de execução Baseado em diretivas de compilação: Todo paralelismo do OpenMP é especificado através de diretivas de compilação. Suporta paralelismo recursivo: Permite que em uma região paralela existam outras regiões que podem ser executadas em paralelo, e assim sucessivamente. Depende da implementação OpenMP. Threads dinâmico: É possível durante a execução do programa alterar o número de threads que serão criados. Depende da implementação OpenMP
Por que usar?
Estrutura
Características Biblioteca para paralelização de código Usa #pragma para definir as regiões paralelas Os programas ainda podem ser executados serialmente Detecta automaticamente o número de processadores O programador não precisa saber a priori o número de processadores disponíveis Exige suporte do compilador
Exercício O objetivo desse exercício é entender como se compila e executa um programa utilizando OpenMP. O programa HELLO, é o mais simples possível; em paralelo várias threads irão imprimir um hello.
Hello World
Hello World
Configurando Ambiente
Configurando Ambiente
Configurando Ambiente
Configurando Ambiente Procure onde está instalado o MinGW no diretorio do codeblock e apaga. Em seguida, copie a pasta MinGW para dentro do codeblck.
Configurando Ambiente
Configurando Ambiente
Configurando Ambiente
Configurando Ambiente
Configurando Ambiente
Região paralela
Região paralela
Região paralela
Região paralela
Elementos de programação
Paralelizar soma de vetores A inserção do construtor paralelo indica que será criado um grupo de threads e que todas as threads desse grupo irão executar as mesmas instruções, ou seja, não há nenhuma divisão de trabalho.
Soma de vetores
Soma de vetores
Soma com 2 threads
Soma com 4 threads
Soma com 4 threads
Soma vetor paralelo
Soma vetor 2 threads
Soma de matrizes
Soma de matrizes
Soma de matrizes
#pragma parallel for main() { int i; #pragma omp parallel for for(i=0;i<1000;i++) DoTask(); } 1 processador 1000 chamadas a DoTask() 4 processadores 250 chamadas a DoTask() para cada processador Distribui automaticamente o trabalho entre as threads.
#pragma parallel for
#Soma matriz com omp for
Condição de corrida
Condição de corrida
Condição de corrida Região crítica: Trecho de código que acessa variáveis compartilhadas entre processos ou threads. Condição de corrida: Quando mais de um processo ou thread acessa suas RCs ao mesmo tempo. Exclusão Mútua: Impedir que dois ou mais processo ou threads acessem sua RCs ao mesmo tempo.
Shared
Private
Private
Soma de matrizes
Soma de matrizes