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
Brunofs (discussão | contribs)
Sem resumo de edição
Brunofs (discussão | contribs)
Sem resumo de edição
Linha 15:
A execução simultânea de instruções possibilita ganhos no tempo final de execução e o melhor aproveitamento das potencialidades das arquiteturas em que executam. Em particular, de modo geral, apenas parte do conjunto de instruções de um programa merece atenção quanto à possibilidade de paralelização.
 
Quanto a código distribuído, existem duas principais propostas para a elaboração de código. A proposta de exploração do paralelismo implícito, procura manter a sintaxe da codificação seqüencial. Nesta primeira proposta o compilador traduz a aplicação escrita em linguagem de alto nível seqüencial para sua forma paralela. Fica deste modo oculto do programador o acréscimo de complexidade introduzido pelo paralelismo, ganhando porém grande complexidade a tarefa de elaboração do compilador paralelizador. Na segunda proposta, exploração da distribuição/paralelismo explícito, as linguagens
O desenvolvimento de programas capazes de realizar execuções em paralelo pode ser obtido de duas maneiras. Uma delas é quando o paralelismo fica a cargo do programador que sabe construir programas paralelos e faz uso de linguagens e ferramentas de programação que lhe oferecem suporte. Outra forma é fazer uso de compiladores que detectam o paralelismo existente em um código seqüencial gerando código paralelo automaticamente.
existentes são ampliadas com construtores específicos para o paralelismo, ou são criadas novas que disponibilizem os mesmos.
 
O desenvolvimento de programas capazes de realizar execuções em paralelo pode ser obtido de duas maneiras. Uma delas, ''paralelismo explícito'', é quando o paralelismo fica a cargo do programador, que sabe construir programas paralelos e faz uso de linguagens e ferramentas de programação que lhe oferecem suporte. Nessa proposta o programador é responsável por especificar o que pode/deve ser executado em paralelo, exigindo que, além de dominar o algoritmo, o programador conheça as características operacionais da arquitetura paralela. Além disso, nesse caso, o projeto do compilador paralelizador tem sua complexidade reduzida, porém ainda engloba aspectos mais sofisticados que o projeto de compiladores para códigos seqüênciais. Outra forma, ''paralelismo implícito'', faz uso de compiladores que detectam o paralelismo existente em um código seqüencial gerando código paralelo automaticamente. Fica deste modo oculto ao programador o acréscimo de complexidade introduzido pelo paralelismo, mantando-se a sintaxe da codificação seqüencial, ganhando porém grande complexidade a tarefa de elaboração do compilador paralelizador.
 
----
Linha 68 ⟶ 71:
Previsão de Conclusão: ''14/12''<br>
<tt>Progresso:</tt><br>
'''FALTA REVISAR: CONTEÚDO E FORMATAÇÃO''' <br>
'''FALTA INCLUIR HISTÓRIA DOS COMPILADORES PARALELIZADORES'''
</center>
----
 
Para que seja possível detectar o paralelismo implícito em uma seqüência de instruções, faz-se necessária uma análise das dependências de dados entre as instruções. Esse é um dos maiores desafios para o desenvolvimento de compiladores paralelizadores eficientes. Se não houver dependências de dados, as instruções podem ser executadas ao mesmo tempo. Caso contrário, conforme o tipo de dependência existente, o compilador poderá realizar otimizações capazes de melhorar o desempenho final do programa, por exemplo, realizando rearranjos nos índices dos loops ou retirando do interior do loop operações que não necessitam estar ali (nessa caso, podendo serem realizadas anteriores ou posteriores ao loop). Os laços de repetição presentes em códigos seqüenciais são potenciais fontes de paralelismo e são foco das análises de compiladores.
 
Se não houver dependências de dados, as instruções podem ser executadas ao mesmo tempo. Caso contrário, conforme o tipo de dependência existente, o compilador poderá realizar otimizações capazes de melhorar o desempenho final do programa, por exemplo, realizando rearranjos nos índices dos loops ou retirando do interior de loops operações que não necessitam estar ali (nessa caso, podendo serem realizadas anteriores ou posteriores ao loop). Os laços de repetição presentes em códigos seqüenciais são potenciais fontes de paralelismo e são foco das análises de compiladores.
Quanto a código distribuído, existem duas principais propostas para a elaboração de código. A proposta de exploração do paralelismo implícito, procura manter a sintaxe da codificação seqüencial. Nesta primeira proposta o compilador traduz a aplicação escrita em linguagem de alto nível seqüencial para sua forma paralela. Fica deste modo oculto do programador o acréscimo de complexidade introduzido pelo paralelismo, ganhando porém grande complexidade a tarefa de elaboração do compilador paralelizador. Na segunda proposta, exploração da distribuição/paralelismo explícito, as linguagens
existentes são ampliadas com construtores específicos para o paralelismo, ou são criadas novas que disponibilizem os mesmos. Nesta proposta o programador é responsável por especificar o que pode/deve ser executado em paralelo, exigindo que além de dominar o algoritmo o programador conheça as características operacionais da arquitetura paralela. Nesta segunda proposta o projeto do compilador paralelizador tem sua complexidade reduzida, porém ainda engloba aspectos mais sofisticados que o projeto de compiladores para códigos seqüênciais.
 
A tarefa de paralelização pode ser dividia em três subproblemas:
 
# identificação de regiões com potencial de paralelismo, o qual pode ser feito automaticamente pelo programador;
# mapearmapeamento odo paralelismo dentro da arquitetura da máquina alvo;
# geração e otimização de código paralelo.
 
Quando os pontos de paralelismo já foram identificados pelo programador, as tarefas de mapeamento e geração de código necessitam de uma detalhada análise do compilador e de transformações no código.
 
A eficiência dos programas gerados por esse tipo de compiladores depende diretamente da arquitetura da máquina sobre a qual ele será executado. Existem ''compiladores para arquiteturas vetoriais'' que detectam instruções de laços de repetição que podem ser transformadas em instruções vetoriais. Esse tipo de compilador é conhecido como compilador vetorizador. Em arquiteturas vetoriais as operações são executadas em pipeline. Cada CPU (Central Processing Unit) vetorial está associada a um tamanho de vetor específico que indica o número máximo de elementos que podem ser inseridos no pipeline. Um compilador vetorizador identifica instruções de laços de repetição que podem ser convertidas em instruções vetoriais. Quanto maior o número de laços convertidos em instruções vetoriais, maior será o desempenho do programa sobre a arquitetura. Quando se trata de ''arquiteturas multiprocessadas'', os compiladores paralelizadores particionam o conjunto de instruções de um laço entre os processadores da arquitetura para sua execução concorrente. Para os casos em que as arquiteturas suportam, podem vir a ser empregadas tanto técnicas de paralelização quanto vetorização conjuntamente.
 
Os compiladores paralelizadores podem ser divididos em dois grupos: os compiladores vetorizadores e os compiladores paralelizadores propriamente ditos.
 
Em arquiteturas vetoriais as operações são executadas em pipeline. Cada CPU (Central Processing Unit) vetorial está associada a um tamanho de vetor específico que indica o número máximo de elementos que podem ser iseridos no pipeline. Um compilador vetorizador identifica instruções de laços de repetição que podem ser convertidas em instruções vetoriais. Quanto maior o número de laços convertidos em instruções vetoriais, maior será o desempenho do programa sobre a arquitetura.
 
Os compiladores paralelizadores propriamente ditos voltam-se a construção de códigos paralelos a serem executados em arquiteturas multiprocessadas. Uma forma tradicional de utilizar os múltiplos processadores disponíveis é particionar o conjunto de iterações de um laço distribuindo-os entre os processadores.
 
Alguns exemplos de compiladores paralelizadores/vetorizadores são o ''Oxigen'', ''OSCAR'' e ''PARADIGM''. Esses compiladores geram código paralelo a partir de códigos seqüenciais escritos em Fortran, assim como váriasvários outros compiladores paralelizadores em desenvolvimento. Um outro exemplo é o SUIF/CVM que paraleliza códigos seqüênciassequenciais Fortran e C. O Parafrase2 é um outro exemplo de compilador paralelizador para a linguagem C.
 
----