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
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
__global__ void matMulCoalesced ( f l o a t∗ B, f l o a t∗ C, f l o a t∗ A, i n t W) {<br />
f l o a t Pvalue = 0 . 0 ;<br />
i n t t x = b l o c k I d x . x ∗ blockDim . x + threadIdx . x ;<br />
i n t t y = b l o c k I d x . y ∗ blockDim . y + threadIdx . y ;<br />
for ( i n t k = 0; k < W; ++k ) {<br />
Pvalue += B [ t y ∗ W + k ] ∗ C[ k ∗ W + t x ] ;<br />
}<br />
A [ t x + t y ∗ W] = Pvalue ;<br />
}<br />
Figura 1.22. Modificação do programa da<br />
figura 1.21 <strong>para</strong> usar acessos agrupados à<br />
memória global.<br />
vamente supondo (tx,ty) = (0,0),(1,0),...,(15,0), e W = 600, as<br />
posições lidas da matrix B serão sempre as mesmas <strong>para</strong> todas<br />
as threads em meio warp e as posições lidas da matriz C serão<br />
consecutivas e portanto contidas em um segmento <strong>de</strong> dados.<br />
Esta simples modificação <strong>de</strong> código nos dá um programa que<br />
é quase 10 vezes mais rápido que aquele programa visto na<br />
figura 1.21, quando executado em uma placa GPU 9400M!<br />
A memória global e a memória compartilhada. Uma boa maneira<br />
<strong>de</strong> medirmos o <strong>de</strong>sempenho <strong>de</strong> uma função em C <strong>para</strong><br />
CUDA é contarmos quantas operações <strong>de</strong> ponto-flutuante esta<br />
função realiza por segundo [32]. Este número é conhecido por<br />
(FLOPS) e <strong>para</strong> obtê-lo, faz-se conveniente observarmos o programa<br />
PTX produzido pelo laço mais interno do programa na<br />
figura 1.22, o qual é mostrado na figura 1.23. Aproximadamente<br />
1/8 das instruções <strong>de</strong>ntro do laço <strong>de</strong>ste programa são<br />
operações <strong>de</strong> ponto flutuante: existem 16 instruções, uma <strong>de</strong>las,<br />
multiply-add, equivale a duas operações. Consi<strong>de</strong>rando-se<br />
que uma placa GTX 8800 realiza 172.8 bilhões <strong>de</strong> operações<br />
<strong>de</strong> ponto-flutuante por segundo, então temos, neste hardware,<br />
uma taxa <strong>de</strong> trabalho <strong>de</strong> 21.6 GFLOPS. Entretanto, ao medir-se<br />
o <strong>de</strong>sempenho <strong>de</strong>ste programa em tal placa, percebeu-se que<br />
a taxa <strong>de</strong> trabalho real é bem menor: 10.58 GFLOPS [32]. O<br />
gargalo, neste caso, é a forma <strong>de</strong> utilização da memória.<br />
26