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