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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

__global__ void <strong>de</strong>pSumKernel ( f l o a t∗ S, i n t si<strong>de</strong> ) {<br />

i n t i = b l o c k I d x . x∗blockDim . x + threadIdx . x ;<br />

i f ( i < si<strong>de</strong> ) {<br />

for ( i n t j = 1; j < si<strong>de</strong> ; j ++) {<br />

i n t i j = i ∗ si<strong>de</strong> + j ;<br />

S [ i j ] = S [ i j ] − S [ i j −1];<br />

}<br />

}<br />

}<br />

Figura 1.10. Programa CUDA equivalente ao<br />

programa visto na figura 1.8.<br />

void digSum ( f l o a t∗∗ s , unsigned i n t si<strong>de</strong> ) {<br />

i n t i , j ;<br />

for ( i = 1; i < si<strong>de</strong> ; i ++) {<br />

for ( j = 1; j < si<strong>de</strong> ; j ++) {<br />

s [ i ] [ j ] = s [ i ] [ j ] − s [ i −1][ j −1];<br />

}<br />

}<br />

}<br />

Figura 1.11. Programa C com ca<strong>de</strong>ias <strong>de</strong> <strong>de</strong>pendências<br />

temporais <strong>de</strong> diferentes tamanhos.<br />

ponente conexo <strong>de</strong>ste grafo. Em nosso exemplo, cada um <strong>de</strong>stes<br />

componentes é uma linha e nossa abordagem <strong>de</strong>mandará<br />

tantos processadores quanto existam linhas em nosso grafo.<br />

Nos exemplos que vimos até aqui, todos os processadores<br />

usados nas soluções <strong>para</strong>lelas realizam a mesma quantida<strong>de</strong><br />

<strong>de</strong> trabalho. Isto quer dizer que em um mundo perfeitamente<br />

SIMD, todos os processadores terminariam ao mesmo tempo.<br />

Existem, contudo, muitos problemas em que tal regularida<strong>de</strong><br />

não está presente. Um exemplo é dado pelo programa C da<br />

figura 1.11, cujo espaço <strong>de</strong> iterações é dado na figura 1.12.<br />

Uma conversão trivial é mecânica do programa da figura 1.11<br />

<strong>para</strong> CUDA leva ao programa da figura 1.13. Este programa possui<br />

um espaço <strong>de</strong> iterações mais largo que o programa original.<br />

14

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

Saved successfully!

Ooh no, something went wrong!