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.

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

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

Saved successfully!

Ooh no, something went wrong!