• Nenhum resultado encontrado

5.6 Trabalhos Correlatos

5.6.2 Relacionados a Abstra¸c˜ oes para Programa¸c˜ ao de GPUs

Do mesmo modo que nossa implementa¸c˜ao Gamma-GPU tem uma vertente que visa prover uma abstra¸c˜ao para o uso de GPUs, possibilitando que a programa¸c˜ao seja expressa em uma linguagem de alto n´ıvel de forma mais natural sem a necessidade de que se conhe¸cam detalhes de baixo n´ıvel do hardware, in´umeros outros trabalhos tamb´em prop˜oem abstra¸c˜oes nesse sentido, visando oferecer ao programador uma interface mais amig´avel para acesso a estes dispositivos. Isto porque as linguagens mais tradicionais, CUDA e OpenCL, para programa¸c˜ao de GPUs, requerem um n´ıvel consider´avel de conhecimento de baixo n´ıvel de t´ecnicas para movimenta¸c˜ao de dados entre mem´orias, sincroniza¸c˜ao e escalonamento da computa¸c˜ao. Na maioria dos casos, os trabalhos que veremos a seguir utilizam CUDA ou OpenCL somente como linguagens intermedi´arias, exibindo ao usu´ario apenas uma linguagem mais abstrata e sintaticamente mais simples, poupando-o de detalhes que n˜ao est˜ao diretamente ligados `a resolu¸c˜ao do problema em si.

Em [56] ´e apresentada uma linguagem chamada CGiS, que visa aumentar a acessibilidade `as GPUs atrav´es de um elevado n´ıvel de abstra¸c˜ao. O foco principal foi permitir que programadores de problemas cient´ıficos, sem experiˆencia em ma- nipula¸c˜ao de GPUs, pudessem se beneficiar do ganho de desempenho oferecido de forma transparente. A linguagem permite que se escreva o algoritmo completo, que ´e ent˜ao submetido a um compilador que gera c´odigo em C++ e diretamente em assembly para GPUs. Um programa em CGiS ´e composto por trˆes se¸c˜oes: INTER- FACE na qual s˜ao declaradas vari´aveis escalares e de fluxo; CODE onde definem-se as fun¸c˜oes sobre os fluxos; e CONTROL que define a intera¸c˜ao entre as fun¸c˜oes.

O trabalho descrito em [57], introduz tamb´em uma nova linguagem para pro- grama¸c˜ao de GPUs, chamada EPGPU (Expressive Programming for GPU ), a qual utilizou OpenCL embutido no ambiente de programa¸c˜ao de C++. Uma das princi- pais abstra¸c˜oes providas ´e chamada de FILL kernel, que permite que as escritas na mem´oria da GPU sejam feitas de modo controlado em tempo de execu¸c˜ao, elimi- nando a chance de aparecimento de problemas como condi¸c˜oes de disputa a regi˜oes

de mem´oria compartilhada.

Uma linguagem de programa¸c˜ao declarativa para GPUs foi proposta em [58], batizada de Harlan. A principal ideia ´e que o programador possa expressar apenas o que fazer, e n˜ao como fazer. A linguagem foi integrada com um outro trabalho pr´evio dos mesmos autores, possibilitando seu uso em clusters de GPUs. O compilador constru´ıdo para a linguagem traduz um programa em Harlan para c´odigo CUDA ou OpenCL, e suporta algumas facilidades sint´aticas, como a determina¸c˜ao autom´atica da configura¸c˜ao de blocos e threads para um certo kernel, divis˜ao de um ´unico kernel em Harlan para v´arios kernels na linguagem de mais baixo n´ıvel, al´em de prover um escalonamento mais eficiente entre kernels de acordo com um grafo ponderado de dependˆencia de dados dos mesmos.

Em [59] foi criada uma linguagem para dom´ınios espec´ıficos chamada Chestnut para programa¸c˜ao de GPUs, voltada para aplica¸c˜oes sobre dados no formato de arrays multidimensionais (grids), como por exemplo solu¸c˜oes finitas de equa¸c˜oes diferenciais parciais, aplic´aveis em problemas como modelagem clim´atica, dinˆamica dos fluidos e difus˜ao de calor. O compilador Chestnut foi escrito em Python e traduz o c´odigo de alto n´ıvel para c´odigo CUDA. A sintaxe para programar em Chestnut ´e similar `a linguagem C, e a ideia foi criar uma forma muito simples de indicar os trechos de c´odigo que devem executar em paralelo nas GPUs, bastando envolvˆe- los pelas declara¸c˜oes foreach e end, que delimitam as opera¸c˜oes a serem aplicadas sobre um conjunto de arrays em paralelo. Alguns experimentos mostraram que programas escritos em Chestnut obtiveram um desempenho bem pr´oximo `aqueles escritos diretamente em CUDA.

Na proposta contida em [60], a ideia foi criar uma abstra¸c˜ao baseada no para- digma orientado a objetos para acesso `as GPUs, atrav´es de uma nova linguagem chamada de Fusion, a qual ´e uma extens˜ao sint´atica sobre a linguagem Java. A principal destas extens˜oes ´e a possibilidade de criar objetos aceleradores, instˆancias de uma classe aceleradora, os quais ter˜ao seus m´etodos executados pelas GPUs. O compilador Fusion gera dois c´odigos separados como sa´ıda, um em Java puro, que cont´em as chamadas aos kernels, e o outro em CUDA, contendo os kernels que s˜ao as implementa¸c˜oes dos m´etodos dos objetos aceleradores.

Outros trabalhos que seguem linhas similares podem ser vistos em [61], [62], [63] e [64].

Cap´ıtulo 6

Experimentos e Resultados

Depois de termos discorrido nos cap´ıtulos anteriores sobre as solu¸c˜oes de imple- menta¸c˜ao envolvidas no trabalho, vamos agora dedicar o presente cap´ıtulo para demonstrar os experimentos pr´aticos realizados com as mesmas, nos quais almeja- mos verificar a corretude da nova implementa¸c˜ao Gamma-GPU, bem como analisar o desempenho do modelo quando executado em uma plataforma distribu´ıda de hard- ware.

6.1

Metodologia Experimental

Utilizamos uma metodologia emp´ırica para proceder os testes do trabalho, na qual foram selecionadas algumas aplica¸c˜oes escritas em Gamma para serem executadas sobre as implementa¸c˜oes Gamma-Base e Gamma-GPU, a fim de que pud´essemos comparar as respostas dos programas e tamb´em medir o tempo total de execu¸c˜ao dos mesmos. A compara¸c˜ao entre as respostas de cada programa nas duas imple- menta¸c˜oes, serve para nos garantir que nossa nova implementa¸c˜ao Gamma-GPU comporta-se de maneira adequada, emitindo resultados corretos para os problemas processados com o aux´ılio das GPUs. J´a a medida dos tempos de execu¸c˜ao, nos ajuda a proceder uma an´alise comparativa de desempenho entre as duas imple- menta¸c˜oes, demonstrando o poder de acelera¸c˜ao de processamento inserido com o uso das GPUs.