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

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

Saved successfully!

Ooh no, something went wrong!