13.04.2013 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!