Programação paralela híbrida para CPU e GPU: uma avaliação do OPENACC frente a OPENMP e CUDA
Abstract
Como consequência do avanço das arquiteturas de CPU e GPU, nos últimos anos
houve um aumento no número de APIs de programação paralela para os dois dispositivos.
Enquanto que OpenMP é utilizada no processamento paralelo em CPU, CUDA e OpenACC
são empregadas no processamento paralelo em GPU. Na programação para GPU, CUDA
apresenta um modelo baseado em funções que deixam o código fonte extenso e propenso a
erros, além de acarretar uma baixa produtividade no desenvolvimento. Objetivando solucionar
esses problemas e sendo uma alternativa à utilização de CUDA surgiu o OpenACC.
Semelhante ao OpenMP, essa API disponibiliza diretivas que facilitam o desenvolvimento de
aplicações paralelas, porém para execução em GPU. Para aumentar ainda mais o desempenho
e tirar proveito da capacidade de paralelismo de CPU e GPU, é possível desenvolver
algoritmos híbridos que dividam o processamento nos dois dispositivos. Nesse sentido, este
trabalho objetiva verificar se as facilidades que o OpenACC introduz também refletem
positivamente na programação híbrida com OpenMP, se comparado ao modelo OpenMP +
CUDA. Além disso, o trabalho visa relatar as limitações nos dois modelos de programação
híbrida que possam influenciar no desempenho ou no desenvolvimento de aplicações. Como
forma de cumprir essas metas, este trabalho apresenta o desenvolvimento de três algoritmos
paralelos híbridos baseados nos algoritmos do benchmark Rodinia, a saber, RNG, Hotspot e
SRAD, utilizando os modelos híbridos OpenMP + CUDA e OpenMP + OpenACC. Nesses
algoritmos é atribuída ao OpenMP a execução paralela em CPU, enquanto que CUDA e
OpenACC são responsáveis pelo processamento paralelo em GPU. Após as execuções dos
algoritmos híbridos foram analisados o desempenho, a eficiência e a divisão da execução em
cada um dos dispositivos. Verificou-se através das execuções dos algoritmos híbridos que nos
dois modelos de programação propostos foi possível superar o desempenho de uma aplicação
paralela em uma única API, com execução em apenas um dos dispositivos. Além disso, nos
algoritmos híbridos RNG e Hotspot o desempenho de CUDA foi superior ao desempenho de
OpenACC, enquanto que no algoritmo SRAD a API OpenACC apresentou uma execução
mais rápida, se comparada à API CUDA.