Sistemas Distribuídos e Paralelos Aula #6: Programação paralela em sistemas de memória compartilhada. ISUTIC - 2016 Eng. Alexander Rodríguez Bonet
Aula de hoje Regiões paralelas. Cláusulas de âmbito. Partilha de tarefas. Tarefas: OpenMP 3.0. Outras ferramentas.
Objectivo Caracterizar as técnicas e ferramentas de programação paralela em memória compartilhada.
Introdução SSDDPP Todos os processadores compartilham o mesmo espaço de direções. Comunicação implícita através do acesso a variáveis compartilhadas. Necessários mecanismos de sincronização (semáforos, secções críticas, barreiras...). Atualmente em auge pelas arquiteturas multicores.
Ferramentas de programação paralela em memória compartilhada. Threads nativos (ex. Pthreads) programação de baixo nível (ainda que portável), baseada em chamadas a bibliotecas. OpenMP: API regular para programação em sistemas de memória compartilhada (Fortran, C/C++) programação de alto nível (diretoras no código sequencial). Portabilidade. Threading Building Blocks: Biblioteca para a programação paralela em memória compartilhada (C/C++). Permite a criação de programas paralelos mediante a combinação de pequenos componentes paralelos. Trabalha com o conceito de Tarefa em lugar
Ferramentas de programação paralela em memória compartilhada. Parallel Pattern Library (PPL): Biblioteca de programação paralela em.net. Baseada em extensões da linguagem Visual C. Programação baseia em padrões de implementação paralela. Trabalha com o conceito de Tarefa em lugar de Fios. Pacote java.util.concurrent de JAVA 7: Conjunto de primitivas de programação concorrente. Introduz conceitos como executor que permite a execução (planejamento) concorrente e transparente de tarefas. Introduz as tarefas de tipo Fork/Join para a implementação de algoritmos concorrentes de tipo Divide e Vencerás.
Características que devem ter estas ferramentas: Um mecanismo de identificação dos threads. Um método para declarar as variáveis como privadas (private) ou compartilhadas (shared). Um mecanismo para poder definir regiões paralelas, bem seja a nível de função ou a nível de iteração de bucle. Facilidades para sincronizar os threads.
OpenMP SSDDPP Um API usado para programação multithreding direto explícito e paralelismo de memória compartilhada. Consta de três componentes API principais: Diretoras do compilador, Rotinas de livraria de tempo de execução e Variáveis de meio. Portável: O API está especificado para C/C e Fortran. Implementou-se em múltiplas plataformas incluindo a maioria de Unix e Windows. Padronizado: Definido em acordo e usado por várias grandes empresas de SW/HW. Espera-se que se converta num regular ANSI.
OpenMP Simples e ligeiro: Estabelece um conjunto de diretoras simples e limitado para programar máquinas de memória compartilhada. Com tão só 3 ou 4 diretoras pode-se implementar um paralelismo significativo. Facilidade de uso. Proporciona capacidade para paralelizar incrementalmente um programa série, ao invés que as bibliotecas de passagem de mensagens, que requerem uma aproximação todo-ou-nada.
Qué não é OpenMP? Não está destinado a programas paralelos em memória distribuída (por si mesmo). Não está necessariamente implementado identicamente por todas as empresas. Não garante o uso mais eficiente da memória compartilhada (na actualidade não há construtores de localidade de dados).
Modelo Fork-Join Realiza um paralelismo explícito, não automático, baseado em fios que oferece ao programador o controle total da paralelización. Usa o modelo de execução paralela Fork-Join. Todos os programas OpenMP começam como um único fio: o fio mestre. O fio mestre executa-se sequencialmente até que se encontre a primeira construção de região paralela.
Modelo Fork-Join FORK: O fio mestre cria uma "equipa" de fios paralelos. As sentenças do programa que estão encerradas numa construção de região paralela se executam então entre vários fios da equipa. JOIN: Quando os fios da equipa completam as sentenças da construção de região paralela, se sincronizam e terminam deixando só ao fio mestre.
Modelo Fork-Join SSDDPP
Diretivas de OpenMP Sintaxe: #pragma omp nombre-directiva [cláusula,...] Pode ter uma, nenhuma ou várias cláusulas. A cada diretiva aplica-se a no máximo uma sentença seguinte, que deve ser um bloco estruturado. São sensíveis a maiúsculas. Só um nome de diretora se pode especificar por diretiva.
Criação de uma região paralela: Uma região paralela é um bloco de código que executarão vários fios. É a construção fundamental de OpenMP. Sintaxe: #pragma omp parallel [cláusula,...] /* structured block*/ Os programas OpenMP executam-se sequencialmente até encontrar a diretiva parallel. Cria-se um grupo de fios cujo número pode ser especificado na diretora. A cada fio criado executa as instruções especificadas em structured block.
Cláusulas: Paralelização condicional: A cláusula if (scalar expression) determina se na região paralela criam-se os fios ou não. Grau de concorrência: A cláusula num_threads(integer expression) especifica o número de fios que serão criados pela diretiva parallel.
Tarefa SSDDPP Pesquisar a utilidade das cláusulas para o manejo de dados: private (variable list) firstprivate (variable list) shared (variable list) default (state) reduction (operator: variable list) Pesquisar a utilidade das diretivas: For barrier Master ordered sections Single Critical
Sistemas Distribuídos e Paralelos Aula #6: Programação paralela em sistemas de memória compartilhada. ISUTIC - 2016 Eng. Alexander Rodríguez Bonet