Técnicas de Otimização de Código para Placas de ... - UFMG
Técnicas de Otimização de Código para Placas de ... - UFMG
Técnicas de Otimização de Código para Placas de ... - UFMG
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
cidas. Esta categoria inclui Cg (C <strong>para</strong> gráficos) e HLSL (High<br />
Level Shading Language). Cg, por exemplo, consiste em uma<br />
coleção <strong>de</strong> funções que po<strong>de</strong>m ser invocadas via uma sintaxe<br />
que difere muito pouco da sintaxe da linguagem C. Existem, contudo,<br />
linguagens muito mais gerais – os exemplos mais notórios<br />
sendo OpenCL e C <strong>para</strong> CUDA.<br />
Neste material nós utilizaremos C <strong>para</strong> CUDA <strong>para</strong> ilustrar<br />
a programação <strong>de</strong> GPUs. Esta linguagem é bastante diferente,<br />
em termos <strong>de</strong> semântica, <strong>de</strong> outras linguagens, tais como C,<br />
C++ ou Java, que também permitem o <strong>de</strong>senvolvimento <strong>de</strong> aplicações<br />
<strong>para</strong>lelas. C, C++, Java e muitas outras linguagens <strong>de</strong><br />
programação foram projetas <strong>para</strong> aten<strong>de</strong>r as necessida<strong>de</strong>s do<br />
hardware <strong>de</strong> propósito geral. Na verda<strong>de</strong>, estas linguagens ten<strong>de</strong>m<br />
a abstrair o hardware, tornando-o quase invisível <strong>para</strong> o<br />
<strong>de</strong>senvolvedor <strong>de</strong> aplicações. Este po<strong>de</strong>, assim, concentrar-se<br />
em <strong>de</strong>talhes algorítmicos dos problemas <strong>de</strong> programação, não<br />
se preocupando com minúcias da arquitetura <strong>de</strong> computadores<br />
subjacente. Entretanto, não é uma tarefa simples abstrair a heterogeneida<strong>de</strong><br />
<strong>de</strong> CUDA. Isto po<strong>de</strong>, obviamente, ser feito em algum<br />
futuro não muito distante; porém, tal ainda não foi feito em<br />
C <strong>para</strong> CUDA. Enquanto <strong>de</strong>senvolvendo aplicações <strong>para</strong> este<br />
ambiente, o programador <strong>de</strong>ci<strong>de</strong> quais partes <strong>de</strong> sua aplicação<br />
irão executar na CPU e quais serão enviadas <strong>para</strong> a GPU. Além<br />
disto, C <strong>para</strong> CUDA precisa prover ao programador mecanismos<br />
com que este possa usufruir do gran<strong>de</strong> po<strong>de</strong>r computacional<br />
presente em uma placa gráfica. Com tal intuito, a linguagem<br />
disponibiliza três abstrações principais:<br />
• uma hierarquia <strong>de</strong> threads;<br />
• memórias compartilhadas;<br />
• barreiras <strong>de</strong> sincronização.<br />
Um programa CUDA contém um corpo principal, que será<br />
executado sobre a CPU, e várias funções especiais, normalmente<br />
chamadas kernels, que serão executadas na GPU. Ao<br />
observar um kernel, temos a impressão <strong>de</strong> que seu texto tratase<br />
<strong>de</strong> um programa sequencial. Entretanto, este mesmo código<br />
será simultaneamente executado por centenas <strong>de</strong> threads. O<br />
8