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.
unida<strong>de</strong>s que executam trabalho em passo único. A fim <strong>de</strong> <strong>de</strong>tectarmos<br />
divergências, um profiler <strong>de</strong>ve ser capaz <strong>de</strong> averiguar<br />
que em <strong>de</strong>terminado <strong>de</strong>svio algumas threads escolheram um<br />
caminho, enquanto as <strong>de</strong>mais threads optaram pelo outro. Tal<br />
po<strong>de</strong> ser feito via instrumentação do código assembly a ser testado.<br />
Esta instrumentação armazena os resultados do profiler<br />
em uma estrutura <strong>de</strong> dados que chamamos <strong>de</strong> mapa <strong>de</strong> divergências.<br />
Tal estrutura consiste em dois arranjos <strong>de</strong> inteiros, os<br />
quais <strong>de</strong>nominaremos τ e δ, sendo que τ[b] armazena o número<br />
<strong>de</strong> warps que visitaram cada bloco básico b e δ[b] armazena a<br />
quantida<strong>de</strong> <strong>de</strong> visitas que resultaram em divergências.<br />
Esta instrumentação é inserida automaticamente, em três<br />
passos:<br />
1. Inicialização: memória é reservada no dispositivo <strong>para</strong><br />
armazenar o mapa <strong>de</strong> divergências;<br />
2. Mensuração: o mapa da divergências <strong>para</strong> uma <strong>de</strong>terminada<br />
execução do programa é construído;<br />
3. Leitura: o mapa <strong>de</strong> divergências é copiado da GPU <strong>de</strong><br />
volta <strong>para</strong> a CPU.<br />
As fases <strong>de</strong> inicialização e leitura são triviais; logo, no que resta<br />
<strong>de</strong>sta seção, <strong>de</strong>screveremos o processo <strong>de</strong> mensuração.<br />
O código <strong>de</strong> instrumentação <strong>de</strong> divergências é mostrado na<br />
figura 1.31. Estas instruções são inseridas sobre cada <strong>de</strong>svio<br />
condicional. Esta figura mostra a instrumentação inserida sobre<br />
o bloco L2 do exemplo visto na figura 1.29. Cada block<br />
b a ser investigado é dividido em três blocos: bup, bbottom e<br />
b f ind writer. A instrumentação realiza duas tarefas: (i) nos blocos<br />
bup e b f ind writer uma thread é selecionada – a thread escritora –<br />
<strong>para</strong> atualizar os arranjos δ e τ. (ii) no bloco bbottom a divergência<br />
é <strong>de</strong>tectada e reportada.<br />
A thread escritora é sempre aquela com o menor i<strong>de</strong>ntificador.<br />
A fim <strong>de</strong> selecionar um escritor não po<strong>de</strong>mos simplesmente<br />
atribuir esta tarefa à thread zero, por exemplo, uma vez que tal<br />
thread po<strong>de</strong> não estar ativa em um trecho <strong>de</strong> código divergente,<br />
exatamente <strong>de</strong>vido a uma divergência anterior. Na figura 1.31<br />
a variável %laneid <strong>de</strong>nota o i<strong>de</strong>ntificador da thread <strong>de</strong>ntro do<br />
40