Programação Paralela em Arquiteturas Multi-Core/Compiladores paralelizadores: diferenças entre revisões
[edição não verificada] | [edição não verificada] |
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição |
Sem resumo de edição |
||
Linha 32:
Classicamente, um compilador traduz um programa de uma linguagem textual facilmente entendida por um ser humano para uma linguagem de máquina, específica para um processador e sistema operacional. Atualmente, porém, são comuns compiladores que geram código para uma máquina virtual que é, depois, interpretada por um interpretador.
Em linguagens de programação híbridas, o compilador tem o papel de converter o código fonte em um código chamado de ''bytecode'', que é uma linguagem de baixo nível. Um exemplo deste comportamento é o do compilador da linguagem Java que, em vez de gerar código da máquina hospedeira (onde se está executando o compilador), gera código chamado ''Java Bytecode''.
Outra parte separada do compilador que muitos usuários vêem como integrada é o linker, cuja função é unir vários programas já compilados de uma forma independente e unificá-los em um programa executável. Isso inclui colocar o programa final em um formato compatível com as necessidades do sistema operacional para carregá-lo em memória e colocá-lo em execução.
Linha 294:
O compilador pode reordenar as instruções para possiblitar a redução de uso de sincronizações. Quanto maior o número de sincronizações necessárias maior será o prejuízo para o desempenho do programa. Nesse ponto vê-se a importância de testes de dependências confiáveis, uma vez que testes mal feitos podem incluir sincronizações desnecessárias influenciando o desempenho final.
Um aliado dos compiladores paralelizadores, em especial em ambientes distribuídos, é o '''multithreading''', técnica utilizada para ocultar a latência de memória e sincronização. Dada uma ''thread'' que por algum motivo teve de ser bloqueada, o ''multithreading'' reduz os custos de requisições remotas executando outras ''threads'' enquanto a ''thread'' corrente estiver bloqueada.
O primeiro ganho de desempenho de ''multithreading'' é que várias ''threads'' podem ser usadas para garantir que o processamento seja realizado enquanto a ''thread'' correntemente ativa aguarda por uma requisição remota. Se o nível de ''multithreading'' for alto o suficiente,
* independência da arquitetura;
Linha 303:
* facilidade de geração de código por compiladores paralelizadores.
Contudo também existem desvantagens com o uso de ''multithreading'', a maioria delas relacionadas ao custo de tratar ''threads'' adicionais.
----
Linha 310:
=== Alguns Exemplos de Compiladores Vetorizadores e/ou Paralelizadores ===
Nessa seção serão apresentados alguns exemplos de compiladores, falando sobre a arquitetura a qual se destinam, a linguagem tratada, bem como sobre suas peculiaridades. Tais compiladores são diretamente influenciados pelas características da arquitetura a qual se destina. Para as arquiteturas em que é possível, os compiladores aplicam técnicas de paralelização e vetorização conjuntamente para obter o melhor aproveitamento do hardware disponível. Embora as técnicas tenham sido apresentadas separadamente neste texto, nada impede sua aplicação conjunta quando a arquitetura as suporta.▼
▲Nessa seção serão apresentados alguns exemplos de compiladores, falando sobre a arquitetura a qual se destinam, a linguagem tratada bem como suas peculiaridades. Tais compiladores são diretamente influenciados pelas características da arquitetura a qual se destina. Para as arquiteturas em que é possível, os compiladores aplicam técnicas de paralelização e vetorização conjuntamente para obter o melhor aproveitamento do hardware disponível. Embora as técnicas tenham sido apresentadas separadamente neste texto, nada impede sua aplicação conjunta quando a arquitetura as suporta.
----
Linha 333 ⟶ 323:
Previsão de Conclusão: ''14/12''<br>
<tt>Progresso:</tt> <br>
'''FALTA
</center>
----
O '''Oxygen
----
Linha 348 ⟶ 337:
----
O ''Oxygen'' portou dois tipos de sistemas com memória distribuída: o de ''comunicação sistólica'' e o de ''comunicação por memória'', conforme observado na figura. Na '''comunicação sistólica''' não há trocas de mensagens. Os dados são transmitidos do enviador para o receptor usando transferências entre as filas de memória ou filas de registradores existentes entre os PEs. Nesse caso, um PE pode se comunicar com seus quatro vizinhos mais próximos. A '''comunicação por memória''', também chamada '''comunicação por troca de mensagens''', acontece entre primitivas ''send'' e ''receive''. As mensagens podem ser roteadas não só aos vizinhos mais próximos e sim a todos os PEs presentes no torus. Embora as trocas de mensagens sejam mais confortáveis para programar, o tempo gasto no gerenciamento e na computação do roteamento impõem uma maior latência para a comunicação.
Para o compilador ''Oxygen'', os programas Fortran podem ser decompostos em uma seqüência de blocos, os quais podem executar em paralelo em todos os PEs. Esses blocos podem ser ''locais'' ou ''públicos''. '''Blocos locais''' podem ou não serem executados em paralelo, mas em qualquer caso sua computação é local sem a necessidade de comunicação. '''Blocos públicos''' sempre executam em paralelo e com comunicações porque suas operações são sobre estruturas de dados distribuidamente alocadas pelos PEs.
A ----
Linha 360 ⟶ 351:
----
Para os programas que apresentam laços de repetição, o tratamento de seus índices acontece similarmente ao tratamento de índices de vetores. Ambos os índices são particionados e mapeados usando as mesmas diretivas. O ''Oxygen'' possui duas diretivas de mapeamento, ROWWISE e COLWISE, que podem ser usadas nesse caso. Elas tanto podem mapear índices double aninhando laços no torus
Como exemplo tem-se o código abaixo.
<pre>
LOOP SPLIT ROWWISE
do 10 i=1,n
Linha 370 ⟶ 363:
20 continue
10 continue
</pre>
No exemplo acima, os dois laços foram alinhado no torus. O laço mais externo foi mapeado entre os PEs de uma mesma coluna do torus pela diretiva ROWWISE considerando que ''n'' é igual ao número de PEs presentes numa coluna do torus. Através da COLWISE, o laço interno foi mapeado entre todos os PEs de uma mesma coluna, novamente considerando ''m'' igual ao número de PEs de uma coluna do torus.
----
|