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.

__global__ s t a t i c void b i t o n i c S o r t ( i n t ∗ values ) {<br />

extern __shared__ i n t shared [ ] ;<br />

const unsigned i n t t i d = threadIdx . x ;<br />

shared [ t i d ] = values [ t i d ] ;<br />

__syncthreads ( ) ;<br />

for ( unsigned i n t k = 2; k 0; j /= 2) {<br />

unsigned i n t i x j = t i d ^ j ;<br />

i f ( i x j > t i d ) {<br />

i f ( ( t i d & k ) == 0) {<br />

i f ( shared [ t i d ] > shared [ i x j ] ) {<br />

swap ( shared [ t i d ] , shared [ i x j ] ) ;<br />

}<br />

} else {<br />

i f ( shared [ t i d ] < shared [ i x j ] ) {<br />

swap ( shared [ t i d ] , shared [ i x j ] ) ;<br />

}<br />

}<br />

}<br />

__syncthreads ( ) ;<br />

}<br />

}<br />

values [ t i d ] = shared [ t i d ] ;<br />

}<br />

Figura 1.28. Implementação da or<strong>de</strong>nação bitônica.<br />

implementação do quicksort <strong>para</strong>lelo <strong>de</strong> Ce<strong>de</strong>rman e Tsigas [9].<br />

Neste caso, a or<strong>de</strong>nação bitônica é invocada <strong>para</strong> or<strong>de</strong>nar os<br />

pequenos arranjos que o quicksort produz via a contínua aplicação<br />

do algoritmo <strong>de</strong> partição pivotal. A implementação da or<strong>de</strong>nação<br />

bitônica, conforme obtida no pacote <strong>de</strong> <strong>de</strong>senvolvimento<br />

da NVIDIA, é dada na figura 1.28.<br />

Dado que a GPU está presa ao mo<strong>de</strong>lo <strong>de</strong> processamento<br />

SIMD, é provável que divergências venham a acontecer durante<br />

a execução da or<strong>de</strong>nação bitônica. Ou seja, invariavelmente a<br />

condição (tid & k) == 0, em que tid é o i<strong>de</strong>ntificador da<br />

thread, será verda<strong>de</strong>ira <strong>para</strong> algumas threads e falsa <strong>para</strong> outras.<br />

A fim <strong>de</strong> observarmos o impacto <strong>de</strong> divergências sobre o<br />

<strong>de</strong>sempenho da aplicação CUDA, faz-se necessário <strong>de</strong>ixarmos<br />

o alto nível da linguagem fonte, <strong>para</strong> nos atermos aos <strong>de</strong>talhes<br />

do código PTX, cujo assembly é mostrado na figura 1.29.<br />

A figura 1.29 usa uma notação que omitimos até agora: tratase<br />

do grafo <strong>de</strong> fluxo <strong>de</strong> controle (CFG). Este CFG <strong>de</strong>screve as<br />

instruções PTX geradas <strong>para</strong> o bloco <strong>de</strong> código da figura 1.28<br />

que existe no escopo do teste ixj > tid. O CFG possui um<br />

36

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

Saved successfully!

Ooh no, something went wrong!