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



Documentos relacionados
Construtores de Sicronização em OpenMP

OpenMP: Variáveis de Ambiente

Programação em Paralelo OpenMP

Arquitetura e Organização de Processadores. Aula 4. Pipelines

Introdução OpenMP. Nielsen Castelo Damasceno

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

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

Sistemas Operacionais: Sincronização entre processos

Replicação. Modelos de Consistência.

Programação Concorrente e Paralela. Noemi Rodriguez

Arquitetura e Organização de Processadores. Aulas 06 e 07. Superescalaridade

Sistemas Distribuídos e Paralelos

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

Programação Concorrente e Paralela. Noemi Rodriguez

Arquiteturas de Sistemas de Processamento Paralelo Modelos de Consistência de Memória em Multiprocessadores

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

Microprocessadores. Execução em Paralelo Pipelines

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

SSC0611 Arquitetura de Computadores

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

UFRJ IM - DCC. Sistemas Operacionais I. Unidade IV Gerência de Recursos Entrada e Saída. 02/12/2014 Prof. Valeria M. Bastos

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

Introdução à Computação: Sistemas de Computação

OpenMP. Adaptado do Material do Calebe de Paula Bianchini

Linguagem de Programação II

Organização e Arquitetura de Computadores I

Programação Concorrente

Arquitetura de Computadores. Processamento Paralelo

Organização de Computadores II. Arquiteturas MIMD

Exclusão Mútua (mutex)

09 Unidade de controlo. v0.1

Sistemas Distribuídos Aula 7

ü Capítulo 4 Livro do Mário Monteiro ü Introdução ü Hierarquia de memória ü Memória Principal ü Memória principal ü Memória cache

Boas Práticas de Programação Concorrente

Organização e Arquitetura de Computadores INTRODUÇÃO

Memórias Cache em Arquiteturas Multiprocessador e Multicore

Estruturas de Sistemas Operacionais

Parte I Multiprocessamento

Universidade Estadual de Mato Grosso do Sul UEMS Curso de Ciência da Computação Disciplina de Algoritmos Paralelos e Distribuídos

Sistemas MIMD. CES-25 Arquiteturas para Alto Desmpenho. Paulo André Castro

Infraestrutura de Hardware. Melhorando Desempenho de Pipeline Processadores Superpipeline, Superescalares, VLIW

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

Concorrência em Processos

OpenMP: Variáveis de Ambiente


Computadores e Programação (DCC/UFRJ)

Arquitetura e Organização de Computadores

Consistência. ncia. Sistemas Distribuídos e Tolerância a Falhas. Trabalho realizado por:

Memória Principal. Tiago Alves de Oliveira

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

Bacharelado em Sistemas de Informação Sistemas Operacionais. Prof. Filipo Mór

ORGANIZAÇÃO DE COMPUTADORES CAPÍTULO4: MEMÓRIAPRINCIPAL

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

Organização de Computadores 2005/2006 Processamento Paralelo

Programação Concorrente e Paralela

SSC0112 Organização de Computadores Digitais I

Introdução aos Sistemas Operacionais

FUNDAMENTOS DE ARQUITETURAS DE COMPUTADORES MEMÓRIA PRINCIPAL CAPÍTULO 4. Cristina Boeres

Consistência e Replicação

Arquitetura de Sistemas Operativos

UNIVERSIDADE ESTADUAL VALE DO ACARAÚ- UEVA. Assunto: Programação Concorrente.

Programação Concorrente

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

Fundamentos de Sistemas Operacionais

1. A pastilha do processador Intel possui uma memória cache única para dados e instruções. Esse processador tem capacidade de 8 Kbytes e é

Paralelismo em Computadores com Tecnologia Multicore

INTRODUÇÃO À TECNOLOGIA DA INFORMAÇÃO ORGANIZAÇÃO COMPUTACIONAL

Sistemas Distribuídos. Capítulo 7 - Aula 16

SSC0611 Arquitetura de Computadores

Modelo de Programação Paralela

AULA DE REVISÃO 3 ILP

Arquitetura de Computadores

Paradigmas de Computação Paralela

Universidade Federal de Campina Grande Unidade Acadêmica de Sistemas e Computação Curso de Bacharelado em Ciência da Computação.

Multiprogramação leve em arquiteturas multi-core

Memória Compartilhada e Distribuída. _ Notas de Aula _ Prof. Tiago Garcia de Senna Carneiro DECOM/UFOP

SSC-0742 PROGRAMAÇÃO CONCORRENTE. Aula 04 Revisão de Arquiteturas Paralelas -Parte 2 Prof. Jó Ueyama e Julio Cezar Estrella

Memória Cache. Adriano J. Holanda. 12 e 16/5/2017

Prof. Rômulo Calado Pantaleão Camara Carga Horária: 2h/60h

Infraestrutura de Hardware. Implementação Monociclo de um Processador Simples

Classes e Objetos. Sintaxe de classe em Java

SSC0510 Arquitetura de Computadores

Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores

Algoritmos Computacionais

AULA 03: PROCESSAMENTO PARALELO: MULTIPROCESSADORES

Comunicação entre Processos

UNIDADE CENTRAL DE PROCESSAMENTO FELIPE G. TORRES

Carlos Eduardo Batista Centro de Informática - UFPB

Memória Compatilhada Distribuída. Bruno M. Carvalho Sala: 3F2 Horário: 35M34

Sistemas Distribuídos Aula 3

Disciplina: Arquitetura de Computadores

Consistência e Replicação

Sistemas de Tempo-Real. Acesso exclusivo a recursos partilhados

Resumão de Infra-estrutura de Hardware

COMPUTADORES. Arquiteturas de Computadores Paralelos. Prof.: Agostinho S. Riofrio

Capítulo 11 Sistemas de Arquivos

Sistemas de Ficheiros Distribuídos. Pedro Ferreira DI - FCUL

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

Sistemas Distribuídos

Definindo melhor alguns conceitos

Transcrição:

Paradigmas de Computação Paralela (UCE Computação Paralela Distribuída) Modelos de consistência de memória João Luís Ferreira Sobral jls@... 29 Março 2011

Resumo Revisão: modelos de threads Qual a necessidade do modelos de consistência? Modelos de consistência sequencial Modelos de consistência relaxada Consistência fraca Consistência na libertação (release) Estudo de casos OpenMP Java Threads

Execução de programas multi-threaded em uniprocessadores (unicore) O processador executa todos os fios de execução do programa A política de escalonamento não é especificada As operações efectuadas por cada fio de execução são executadas por ordem Sincronização entre fios de execução através de operações atómicas (c/ locks) As instruções executadas por cada fio são intercaladas Não determinismo: o resultado do programa depende da forma como são escalonados os fios de execução; ex: Thread 1 Thread 2.. x := 1; print(x); x := 2;

Execução de programas multi-threaded em muli-processadores Cada processador executa um fio de execução do programa (consideramos o número de fios igual ao número de processadores) As operações efectuadas por cada fio de execução são executadas por ordem Um processador pode aceder à memória global para fazer load/store/operações atómicas Não há caching da dados globais Os resultados possíveis de um programa são iguais aos de um uniprocessador. Considerações mais realistas: Caching de dados globais para melhorar a eficiência Requer um protocolo de coesão de caches Execução fora de ordem de instruções Pode alterar a semântica do programa => obriga a um modelo de consistência de memória

Execução fora de ordem de instruções (execution out-of-order ) Os processadores reordenam as instruções para melhorar o desempenho As re-ordenações devem respeitar as dependências Dados e.g., loads/stores devem ser executados pela ordem especificada Controlo As re-ordenações podem ser efectuadas pelo processador ou pelo compilador Re-odenações permitidas Stores em diferentes localizações store v1, data store b1, flag store b1, flag ß à store v1, data Loads de diferentes localizações load flag, r1 load data,r2 load data, r2 ß à load flag, r1 Loads e stores em diferentes localizações

Execução fora de ordem de instruções Exemplo de reordenação efectuada pelo hardware Load bypassing Store buffer Memory system O store buffer armazena operações de store para a enviar para a memória Os loads têm prioridade sobre os stores para manter o processador ocupado Ultrapassam os stores no buffer Os loads verificam se existe um store nesse mesmo endereço Resultado: os load e stores não são efectuados pela ordem do programa

Execução fora de ordem de instruções em multiprocessadores Modelo canónico Operações realizadas por um dado processador são efectuadas por ordem As operações realizadas em memória por vários processadores são intercaladas Se um processador reordenar o seu fluxo de instruções, será que a execução produz o mesmo resultado que o modelo canónico? Inicialmente A = Flag = 0 P1 P2 A = 23; while (Flag!= 1) {;} Flag = 1;... = A; P1 escreve dados em A e assinala isso a P2 através da Flag P2 espera até a Flag estar activa, então lê o A O que acontece se P1 trocar a ordem dos stores?

Execução fora de ordem de instruções em multiprocessadores Exemplo II Flag1 = Flag2 = 0 P1 P2 Flag1 = 1; Flag2 = 1; If (Flag2 == 0) If (Flag1 == 0) critical section critical section Uma possível ordem de execução P1 P2 Write Flag1, 1 Write Flag2, 1 Read Flag2 //get 0 Read Flag1 // get 1? => só se os load e stores forem efectuados por ordem

Conclusões Modelos de consistência de memória Os sistemas uni-processador podem reordenar as instruções para melhorar o desempenho, respeitando as dependências de dados e de controlo (locais!) Este pressuposto não é válido para ambientes multi-processador de memória partilhada Um programa paralelo pode produzir resultados contra-intuitivos Quais as limitações que se devem impor à reordenação de instruções para que: A programação seja intuitiva Não se perca o desempenho uni-processador Solução: modelo de consistência de memória suportado pelo processador Modelo de consistência sequencial (o mais simples): O processador não pode reordenar as leituras e escritas na memória global Reduz o desempenho uni-processador

Modelos de consistência relaxada (relaxed consistency) Consistência fraca (weak consistency) O programador especifica regiões onde as operações devem ser ordenadas Instruções de fence As operações antes de fence devem completar antes do fence ser executado As operações depois de fence têm que esperar que o fence termine. Os fences são executados por ordem Implementação de fence Contador incrementado a cada iniciação de uma operação de fence Exemplo: Instrução SYNC no PowerPC flush em OpenMP Operações de sincronização do tipo lock/unlock fence fence As operações nestas regioes podem ser reordenadas Ordem de execução fence

Modelos de consistência relaxada Consistência fraca (weak consistency) Exemplo I - Revisto Inicialmente A = Flag = 0 P1 P2 A = 23; flush while (Flag!= 1) {;} Flag = 1;... = A; P1 escreve dados em A O flush espera que a escrita de A seja completada P1 escreve dados na Flag P2 vai ler Flag==1 quando a escrita em A completou, mesmo que as operações antes do flush sejam executadas fora de ordem Será necessário um flush entre as duas operações em P2?

Modelos de consistência relaxada Consistência de release Mais relaxada que a consistência fraca O modelo de consistência fraca não diferencia entre leituras e escritas (a instrução de fence implica a escrita/leitura de todos os valores alterados) O modelo de consistência de libertação atualiza os valores locais (lidos da memória) à entrada da região crítica e escreve os valores na memória à saída da região. Acessos de sincronização divididos em: Aquisição: operações do tipo lock deve ser efectuada antes realizar acessos à memória não espera pelos acessos que a precedem (1) (1) L/S ACQ Libertação: operações do tipo unlock Deve ser efetuada após todas as escritas Acessos após o release não têm que esperar pelo release (2) L/S REL L/S (2)

Implementação em processadores actuais

Modelos de consistência Impõe restrições à reordenação de instruções de um processador Não estão relacionadas com as operações na memória de diferentes processadores Existem muitos modelos de consistência de memória Consenso emergente em torno de fraco/ release É fácil escrever um programa cujo comportamento seja dependente do modelo de consistência de memória utilizado Coesão da memória (visto anteriormente) Cria a ilusão de uma só localização lógica correspondente a cada variável do programa mesmo que existam múltiplas localizações para essa variável

Modelo do OpenMP Baseia-se num modelo de consistência fraca Os fios de execução podem ter uma vista temporária da memória (registos, cache, etc..) As escritas e leituras podem ser efectuadas na memória local Instrução fence #pragma omp flush Força a consistência entre a vista temporária e a memória (para a lista de variáveis fornecida no flush) As variáveis alteradas localmente são escritas na memória As cópias locais de variáveis são descartadas para que a próxima leitura seja efectuada da memória A operação termina quando todas as variáveis foram actualizadas na memória Não é garantida a ordenação entre flush se a lista de variáveis for disjunta A memória/variáveis privadas (threadprivate, private) não são afectadas pelo flush O flush é implícito em: Barrier, set_lock, unset_lock, atomic Entrada e saída de parallel, critical e ordered A sincronização através de variáveis em memória é desaconselhada

Modelo do Java Modelos de consistência de memória O modelo original foi revisto em 2004 (Java 5.0) por limitar demasiado as optimizações do compilador e não fornecer garantias suficientes ao programador Baseia-se num modelo de consistência relaxada (ordenação parcial de eventos) Os fios de execução podem manter cópias locais dos dados que não estão sincronizadas com os valores na memória. As variáveis declaradas como voláteis não são armazenadas localmente Memória partilhada entre fios de execução Variáveis de instância, variáveis estáticas, elementos de arrays Variáveis locais, parâmetros e handler de excepções não são partilhados. Regiões synchronized: Na entrada invalida cópias locais dos dados Na saída faz flush das variáveis Implica ordenação entre regiões consecutivas (protegidas pelo mesmo lock!) Problema do modelo antigo: não força a semântica sequencial de outras variáveis relativamente às voláteis Inicialmente A = Flag = 0 Flag declarada como volátil P1 P2 A = 23; while (Flag!= 1) {;} Flag = 1;... = A; P1 escreve dados em A e assinala isso a P2 através da Flag P2 espera até a Flag estar activa, então lê o A