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.
__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