Programação em Memória Compartilhada com OpenMP Esbel Tomás Valero Orellana Bacharelado em Ciência da Computação Departamento de Ciências Exatas e Tecnológicas Universidade Estadual de Santa Cruz evalero@uesc.br 25 de Maio de 2010 Introdução ao OpenMP 1 / 29
Conteúdo Introdução 1 Introdução 2 3 Introdução ao OpenMP 2 / 29
Conteúdo Introdução 1 Introdução 2 3 Introdução ao OpenMP 3 / 29
Técnicas de programação em MC Programas construídos para um modelo de programação de memória compartilhada precisam de ferramentas que englobem: técnicas para criação e manipulação de threads, mecanismos de sincronização entre as threads, recursos para manipulação de memória compartilhada. Processos vs Threads? Introdução ao OpenMP 4 / 29
Técnicas de programação em MC As ferramentas mais comuns para ambientes de memória compartilhada são baseadas em: Threading explícito Diretivas de Compilação (threading implícito) Troca de mensagens Linguagens paralelas Threading explícito: O programador cria explicitamente múltiplas threads dentro de um mesmo processo e divide também explicitamente o trabalho a ser realizado. Posix Threads Win32 Threads Algumas linguagens de alto nível Introdução ao OpenMP 5 / 29
Técnicas de programação em MC Diretivas de compilação: O programador utiliza diretivas de compilação, que são inseridas no código seqüencial, para informar ao compilador as regiões que devem ser paralelizadas. OpenMP Troca de mensagens: A comunicação via troca de mensagem também é utilizada como técnica para programação em ambientes de memória compartilhada. MPI Linguagens paralelas: Linguagens de alto nível criadas ou estendidas para trabalhar com esse modelo de programação. HPF - High Performance Fortran Introdução ao OpenMP 6 / 29
OpenMP Introdução O que significa OpenMP: Open specifications for Multi Processing via collaborative work between interested parties from the hardware and software industry, goverment and academia. Open + MP = Padrão aberto + Maquinas multiprocessadas O que é o OpenMP: Um modelo de programação em memória compartilhada que nasceu da cooperação de grandes fabricantes de hardware e software (Sun, Intel, Fujitsu, SGI, AMD, HP, IBM, PGI, KAI,...) Definida para ser utilizada em programas C\C++ e Fortran, Introdução ao OpenMP 7 / 29
OpenMP Introdução O que é o OpenMP... Desenvolvido e mantido pelo grupo OpenMP ARB (Architecture Review Board), É uma API para programação paralela em arquiteturas multiprocessadas, Permite a criação de programas paralelos com compartilhamento de memória, através da criação automática e otimizada de um conjunto de threads, Introdução ao OpenMP 8 / 29
OpenMP Introdução O que é o OpenMP... OpenMP não é uma linguagem de programação, É um padrão que define como os compiladores devem gerar códigos paralelos através de diretivas e funções, Implementação Especificação, O resultado depende do compilador utilizado, http://www.openmp.org Introdução ao OpenMP 9 / 29
Cronologia Introdução Fortran versão 1.0, Outubro de 1997 C\C++ versão 1.0, Outubro de 1998 Fortran versão 1.1, Novembro de 1999 Fortran versão 2.0, Novembro de 2000 C\C++ versão 2.0, Março de 2002 C\C++ e Fortran versão 2.5, Maio de 2005 (unificado) C\C++ e Fortran versão 3.0, Maio de 2008 Introdução ao OpenMP 10 / 29
Objetivos do OpenMP Ser o standard de programação para arquiteturas de memória compartilhada, Estabelecer um conjunto muito simples e limitado de diretivas de programação, Permitir a paralelização incremental de programas seqüenciais, Conseguir implementações eficientes em problemas de granularidade fina, média e grossa. Introdução ao OpenMP 11 / 29
Componentes do OpenMP Introdução ao OpenMP 12 / 29
Modelo de programação do OpenMP Paralelismo explícito Multi-thread implícito Introdução ao OpenMP 13 / 29
Modelo de programação do OpenMP Paralelismo explícito Multi-thread implícito Paralelismo explícito Cabe ao programador identificar as tarefas para execução em paralelo e definir os pontos de sincronização, Essas operações são feitas utilizando diretivas de compilação embebidas no código do programa. Introdução ao OpenMP 13 / 29
Modelo de programação do OpenMP Multi-thread implícito: Um processo é visto como um conjunto de threads que se comunicam entre através da utilização de variáveis compartilhadas, A criação, iniciação e finalização das threads é feita pelo ambiente de execução de ocultando os detalhes do programador, O espaço de endereçamento global é compartilhado por todos os threads, As variáveis podem ser compartilhadas ou privadas (duplicadas) para cada thread, O controle, manuseio e sincronização das variáveis envolvidas nas tarefas paralelas é transparente ao programador. Introdução ao OpenMP 14 / 29
Modelo de execução do OpenMP Modelo de execução Fork-Join Todos os programas iniciam sua execução com um processo, o master thread, O master thread executa seqüencialmente até encontrar um construtor paralelo, momento em que cria um grupo de threads, O código delimitado pelo construtor paralelo é executado em paralelo pelo master thread e pelo grupo de threads, Ao completarem a execução paralela o grupo de threads sincroniza uma barreira implícita com o master thread, O grupo de threads termina a sua execução e o master thread continua a executar seqüencialmente até encontrar um novo construtor paralelo. Introdução ao OpenMP 15 / 29
Modelo de execução do OpenMP Modelo de execução Fork-Join Introdução ao OpenMP 16 / 29
Estrutura de um programa OpenMP Introdução ao OpenMP 17 / 29
Compiladores com suporte a OpenMP Compilador Distribuidor Informações XL IBM Proprietário, SO: Windows e Linux SC Sun Microsystems Proprietário, Sun studio compiladores e ferramentas, download gratuito para Linux e Solaris ICC Intel Propietário, SO: Windows, Linux e MacOS gcc (4.3.2) GNU Livre de código aberto, SO: Linux, Windows, Solaris, MacOS Introdução ao OpenMP 18 / 29
Vantagens do OpenMP Facilidade de conversão de programas seqüenciais em paralelos, Maneira simples de explorar o paralelismo, Fácil compreensão e uso das diretivas, Minimiza a interferência na estrutura do algoritmo, Compila e executa em ambientes paralelo e seqüencial. Introdução ao OpenMP 19 / 29
OpenMP e arquiteturas multicore Arquiteturas multicore, Fraco desempenho das aplicações atuais em arquiteturas multicore, Incremento do número de núcleos, Aplicações eficientes em processadores multicore devem utilizar intensivamente o conceito de threads. Introdução ao OpenMP 20 / 29
Conteúdo Introdução 1 Introdução 2 3 Introdução ao OpenMP 21 / 29
Diretivas de compilação em OpenMP Diretivas são linhas de código com significado especial para o compilador; #pragma omp, indica ao compilador a presença de uma diretiva de compilação, sinalizando que deverá dar criar código paralelo otimizado para o ambiente OpenMP; diretive, deverá ser uma diretiva válida de OpenMP; clause, representa um conjunto de parâmetros e informações a serem aplicados a essa diretiva, (opcional). Introdução ao OpenMP 22 / 29
Diretivas de compilação em OpenMP As diretivas se aplicam a blocos sintáticos, Bloco sintático composto Bloco sintático simples Introdução ao OpenMP 23 / 29
Diretivas de compilação em OpenMP Diretivas Clausulas: Definem o comportamento das regiões paralelas e das variáveis aos quais estão associadas. Introdução ao OpenMP 24 / 29
Compilação condicional Quando um código que contém diretivas do OpenMP é compilado por um compilador que não suporta o OpenMP este simplesmente ignora as diretivas e compila o programa de forma seqüencial, Entretanto, se o código conter chamadas a funções do Open- MP teremos erros de compilação, Para escrever código que funcione com e sem OpenMP devemos utilizar a compilação condicional. Introdução ao OpenMP 25 / 29
Compilação condicional Para termos compilação um código robusto devemos proteger as chamadas a funções do OpenMP com a diretiva #ifdef _OpenMP, A macro _OpenMP esta definida se a biblioteca do OpenMP estiver disponível, Exemplo Introdução ao OpenMP 26 / 29
Conteúdo Introdução 1 Introdução 2 3 Introdução ao OpenMP 27 / 29
Hello word!!! Introdução Introdução ao OpenMP 28 / 29
Atividades Introdução 1 Compile e execute o programa anterior, comente sobre a saída. 2 Modifique a diretiva #pragma omp paralell para #pragma omp paralell num_threads(4), compile e execute novamente, comente o resultado. 3 Visite a página http://www.openmp.org. Introdução ao OpenMP 29 / 29