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.

Kernel Figura Speed-up Registradores Ocupação<br />

matMul 1.21 1 9 1<br />

matMulCoalesced 1.22 9.54 9 1<br />

matMulTiled 1.24 11.75 11 2/3<br />

matMulUnroll 1.26 26.28 9 1<br />

Tabela 1.1. Resultados obtidos durante a<br />

otimização do kernel <strong>de</strong> multiplicação matricial.<br />

<strong>de</strong> obtermos a máxima ocupação do hardware, cada thread po<strong>de</strong>ria<br />

utilizar no máximo 10 registradores.<br />

Desta forma, existe uma tensão entre o número <strong>de</strong> registradores<br />

disponíveis <strong>para</strong> cada thread e a quantida<strong>de</strong> <strong>de</strong> threads<br />

que po<strong>de</strong>m ser executadas simultaneamente. Por exemplo, o<br />

programa da figura 1.21 usa 9 registradores. Portanto, ele po<strong>de</strong><br />

executar a quantida<strong>de</strong> máxima <strong>de</strong> 768 threads, uma vez que<br />

9 × 768 < 8,192. Ou seja, uma placa GeForce 8800 po<strong>de</strong> escalonar<br />

três blocos, cada um com 256 threads, <strong>para</strong> executarem<br />

juntos. Todavia, caso a pressão <strong>de</strong> registradores aumente em<br />

duas unida<strong>de</strong>s, como <strong>de</strong>u-se no programa da figura 1.24, então<br />

teríamos 256 × 11 × 3 = 8,488 > 8,192. Neste caso apenas<br />

dois blocos <strong>de</strong> threads po<strong>de</strong>riam ser executados em conjunto,<br />

resultando em uma taxa <strong>de</strong> ocupação do hardware <strong>de</strong> 2/3.<br />

O cálculo da pressão <strong>de</strong> registradores, isto é, o número<br />

máximo <strong>de</strong> registradores <strong>de</strong>mandado por um programa é um<br />

problema difícil e muitas <strong>de</strong> suas variações são problemas NPcompletos.<br />

Duas variáveis po<strong>de</strong>m ser alocadas no mesmo registrador<br />

se elas não estão “vivas" no mesmo ponto do programa.<br />

Dizemos que uma variável v está viva em um <strong>de</strong>terminado<br />

ponto <strong>de</strong> programa p se existe um caminho no fluxo <strong>de</strong><br />

execução do programa que vai <strong>de</strong> p até um outro ponto <strong>de</strong> programa<br />

p ′ on<strong>de</strong> v é usada. Este caminho não <strong>de</strong>ve passar por<br />

nenhuma <strong>de</strong>finição da variável v. A figura 1.27 ilustra estas noções.<br />

Nesta figura temos uma função que possui um parâmetro<br />

<strong>de</strong> entrada e duas variáveis. Este parâmetro e as variáveis precisam<br />

ser armazenados em alguma área <strong>de</strong> memória. I<strong>de</strong>almente<br />

32

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

Saved successfully!

Ooh no, something went wrong!