OpenACC, OpenCL e OpenARC: um estudo sobre ferramentas abertas para Sistemas Heterogêneos

Resumo do trabalho

Chamam-se sistemas heterogêneos aqueles sistemas computacionais cuja arquitetura envolve mais de um tipo de core. Alguns desses sistemas envolvem programação em GPUs, Xeon Phis e FPGAs, por exemplo. O desenvolvimento de aplicações nesses sistemas demanda algum conhecimento acerca do hardware de cada uma das diferentes plataformas, o que pode se apresentar como entrave para a construção de aplicações portáveis e passíveis de melhoramento contínuo. Uma outra dificuldade na construção de aplicações portáveis em sistemas heterogêneos é o uso de ferramentas oferecidas por vendedores, visto que é comum que elas sirvam apenas para programação de alguns dos dispositivos que compõe um sistema heterogêneo.

Por esse motivo, têm se tornado populares frameworks de alto nível e independentes de plataforma para codificação em sistemas de alto desempenho. O uso desse tipo de ferramenta permite a quem programa a abstração de detalhes de baixo nível e dependentes de dispositivo, o que naturalmente leva à escrita de programas mais portáveis e de fácil manutenção. Com esses desafios em mente, este trabalho aborda três ferramentas abertas, independentes de fornecedores, e de alto nível para programação em sistemas heterogêneos: OpenACC, OpenCL e OpenARC.

OpenACC

O OpenACC é uma framework para programação em sistemas heterogêneos baseada em diretivas. Trata-se de uma framework de alto nível, aberta e portável. Apesar de sua facilidade em uso, o OpenACC dá suporte ao controle sobre paralelismo em diferentes níveis, ao gerenciamento de memória, à sincronização de dados e de tarefas.

OpenCL

O OpenCL, assim como o OpenACC, surgiu com o objetivo de fornecer uma plataforma uniforme e aberta para sistemas computacionais heterogêneos. Sua sintaxe também é baseada na linguagem C, mas, diferentemente do OpenACC, cujo uso ocorre preferencialmente por diretivas de compilação, a programação em OpenCL ocorre com o uso de funções da API oferecida por essa framework.

Ademais, existe uma separação mais clara entre os trechos do programa que serão executados no anfitrião e os trechos de código que serão executados nos dispositivos. Isso porque trechos de código a serem executados nos dispositivos devem estar encapsulados em kérneis, que são funções escritas numa linguagem baseada em C, chamada OpenCL C. Além dessa separação em código, os tipos utilizados pela máquina anfitriã podem ser diferentes dos tipos definidos pelo OpenCL C que são utilizados pelo acelerador.

OpenARC

O OpenARC é um transpilador de código aberto, desenvolvido no Oak Ridge National Laboratory, que transforma código escrito em OpenACC ou OpenMP em CUDA ou OpenCL a ser executado em uma de 8 opções de plataforma. Ele foi desenvolvido justamente com algumas das dificuldades de uso OpenCL e CUDA em mente.

Além de fazer essa tradução, o OpenARC foi projetado de maneira modular, o que permite desenvolver passadas diferentes independentemente e gerar informações para depuração entre uma passada e outra.

Monografia

Você pode baixar o trabalho completo aqui.