• Nenhum resultado encontrado

A.14 Código fonte do algoritmo PN com LED-PPOPP

4. TRABALHOS RELACIONADOS

4.3 Síntese

Neste breve estudo identifica-se o esforço da comunidade para facilitar o desenvolvimento de

software paralelo e melhorar a exploração do paralelismo das arquiteturas. Existe uma diversidade

de ferramentas para exploração de paralelismo. As interfaces de programação paralela (bibliotecas e API’s) se aplicam no contexto de flexibilidade para obter soluções de alto desempenho. Os

Frameworks não são tão flexíveis para a exploração de paralelismo, entretanto, têm por objetivo

abstrair os detalhes de programação paralela e são frequentemente implementados em linguagens orientadas a objetos, permitindo a reutilização de soluções paralelas anteriormente construídas. O desafio inicial deste trabalho de pesquisa é aprender com estas abordagens e propor uma maneira de obter as características de flexibilidade, facilidade e alto desempenho em uma única solução através de uma DSL.

Nota-se que, DSLs não são encontradas no cenário de interfaces de programação paralela. Isso se torna um diferencial com relação a proposta de pesquisa deste trabalho, onde o objetivo é prover uma interface orientada a padrões paralelos para um domínio específico, o qual, refere-se a programação paralela em ambientes multi-core.

De modo a complementar o relacionamento entre os trabalhos elencados nesta pesquisa, tabulou- se algumas das principais características importantes na exploração de paralelismo em arquiteturas

multi-core, ranqueando-as de 0 a 3 estrelas (⋆) e associando com a afinidade do trabalho, con-

forme é expressado na Tabela 4.1. Através desta representação, buscou-se diferenciar os trabalhos atualmente utilizados, identificando as possíveis contribuições neste cenário para a implementação da LED-PPOPP.

O paralelismo em laços é uma necessidade comum para obter vantagem sobre uma arquitetura

Tabela 4.1: Avaliação das características dos trabalhos.

Características TBB OpenMP Pthread Cilk SWARM IPS FastFlow Galois

Paralelismo em la- ços ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ Paralelismo em ta- refas ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ Paralelismo em Fluxo (pipeline) ⋆ ⋆ ⋆ ⋆ ⋆ Paralelismo incre- mental ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ Criação implícita do paralelismo ⋆ ⋆ ⋆ ⋆ ⋆ ⋆ Programação ori- entada a padrões paralelos

torno deles. A grande maioria dos trabalhos implementam diretivas para paralelizar os problemas de laços for. Naturalmente, as interfaces de programação paralela de mais baixo nível são baseadas no paralelismo de tarefas, o que torna mais difícil resolver este tipo de problema em paralelo.

Alguns trabalhos implementam a técnica de paralelismo em fluxo, permitindo que as computações sejam paralelizadas através de estágios em um pipeline. Enquanto isso, outros trabalhos focam no paralelismo incremental, evitando que grandes alterações sejam realizadas em um programa sequencial. Evidentemente, as interfaces que implementam abstração de alto nível proporcionam o paralelismo mais implícito, ocultando os detalhes de programação paralela.

Padrões paralelos são soluções especializadas para estruturar e modelar algoritmos que obtém vantagem sobre as arquiteturas paralelas. Observa-se que nenhum dos trabalhos implementa uma interface introduzindo este conceito. Em vista disso, está se propondo uma DSL que forneça todas as características elencadas através de uma interface que introduza a abordagem de Programação Paralela Orientada a Padrões Paralelos (PPOPP), sendo elaborada e apresentada na Seção 5.1.

5. LINGUAGEM ESPECÍFICA DE DOMÍNIO DE PROGRAMAÇÃO

PARALELA ORIENTADA A PADRÕES PARALELOS (LED-PPOPP)

A LED-PPOPP é uma Linguagem Específica de Domínio de Programação Paralela Orientada a Padrões Paralelos. Primeiramente, realizou-se um estudo de caso implementando o padrão Mes- tre/Escravo baseado no modelo PPOPP, representado na Figura 5.2 e discutido na Seção 5.1. Do mesmo modo, suporta o desenvolvimento de programas com a linguagem C e exploração de paralelismo em arquiteturas multi-core.

Esta, por sua vez, dispõe de uma interface de núcleo e subnúcleo do padrão Mestre/Escravo, onde mecanismos de sincronização e proteção de dados compartilhados também são fornecidos. A interface (descrita na Seção 5.2) é reconhecida através de um compilador da linguagem, o qual é responsável pela análise e geração de código paralelo (descrito na Seção 5.4). O compilador é o principal elemento que compõe o projeto de algoritmos paralelos para o ciclo de desenvolvimento ilustrado na Figura 5.1.

Figura 5.1: Ciclo de desenvolvimento de software paralelos com LED-PPOPP.

Caracterizando-se em um ciclo de desenvolvimento de software é possível identificar todo o processo que envolve a criação de soluções paralelas a partir da LED-PPOPP. Assim, classificou-se em quatro fases de projeto, verificando separadamente os papeis de cada uma delas neste ciclo:

a fase de Código Fonte refere-se ao ambiente de desenvolvimento, onde são utilizados os recursos da linguagem LED-PPOPP para criar uma solução paralela;

na Análise do Código é utilizado o compilador da linguagem, no qual é realizado a análise sintática e semântica do código da solução.

Geração de Código Paralelo não está explícito ao programador, pois esta fase faz parte do processo de compilação e é realizada automaticamente com base no modelo semântico; • Execução é a fase onde o programador executa a aplicação e realiza testes para avaliar o

funcionamento e o desempenho.

De acordo com a Figura 5.1, o desenvolvimento de software paralelo inicia com a fase de código fonte. Após concluir a escrita da solução, a fase de análise do código é inicializada com a intervenção

do compilador da linguagem. Se houver algum erro, o compilador efetua um bloqueio, impedindo que a programação avance para a próxima fase, caso contrário, se não foram constatados erros, avança-se para a fase seguinte. Então, acontece a geração automática do código paralelo, a qual faz parte do processo de compilação. Com o código binário gerado, o desenvolvedor pode testar (executar) a aplicação. Se esta não apresentar resultados satisfatórios, novas otimizações no código poderão ser efetuadas, iniciando-se novamente o ciclo de desenvolvimento.

Documentos relacionados