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.

um valor verda<strong>de</strong>iro em %p se todas as threads no warp encontrarem<br />

o mesmo valor <strong>para</strong> o predicado q. Assim, votam<br />

as threads com respeito ao predicado usado no <strong>de</strong>svio condicional.<br />

Se todas as threads no warp enxergam o mesmo valor<br />

<strong>para</strong> tal predicado, então nenhuma divergência acontece; doutro<br />

modo, uma divergência faz-se notar, levando então, ao incremento<br />

do arranjo δ. Tal adição é realizada pela instrução<br />

atômica @iAmWriter %δ[L2] = atom.add %δ[L2] 1, a qual é<br />

executada somente se o predicado @iAmWriter for verda<strong>de</strong>iro.<br />

A instrumentação impõe uma pesada carga sobre o programa<br />

instrumentado. Em termos <strong>de</strong> tamanho, este cresce entre<br />

2 e 3 vezes. Já em termos <strong>de</strong> tempo <strong>de</strong> execução, a carga é<br />

ainda maior: foram já reportadas perdas <strong>de</strong> <strong>de</strong>sempenho <strong>de</strong> até<br />

1,500x [12], o que não está em <strong>de</strong>sacordo com outors profilers<br />

baseados em instrumentação e usados em ambientes sequenciais<br />

[27]. De qualquer forma, o ponto mais importante é que a<br />

instrumentação não modifica a semântica do programa original,<br />

uma vez que aquela não altera nenhuma das variáveis <strong>de</strong>ste.<br />

Logo, a observação das divergências, ainda que intrusiva, não<br />

causa a existência <strong>de</strong> novas divergências, ou a ausência <strong>de</strong> divergências<br />

existentes no programa original.<br />

Usando informação <strong>de</strong> profiling <strong>para</strong> otimizar aplicações:<br />

Nesta seção mostraremos como obter mais <strong>de</strong>sempenho <strong>de</strong><br />

aplicações CUDA usando <strong>para</strong> isto o resultado da informação<br />

<strong>de</strong> profiling. Otimizaremos o algoritmo <strong>de</strong> or<strong>de</strong>nação bitônica<br />

mostrado na figura 1.28, porém mostraremos resultados obtidos<br />

<strong>para</strong> a implementação <strong>de</strong> quicksort <strong>de</strong> Ce<strong>de</strong>rman et al. [9].<br />

Este algoritmo usa o kernel da figura 1.28 <strong>para</strong> or<strong>de</strong>nar arranjos<br />

<strong>de</strong> tamanho abaixo <strong>de</strong> um certo limiar. Os ganhos <strong>de</strong> <strong>de</strong>sempenho<br />

que reportaremos nesta seção referem-se, portanto, ao<br />

algoritmo quicksort inteiro, embora nós mudaremos somente a<br />

or<strong>de</strong>nação bitônica, que é um sub-módulo daquele algoritmo.<br />

Veremos, assim, que é possível obter entre 6-10% <strong>de</strong> melhorias<br />

<strong>de</strong> <strong>de</strong>sempenho modificando entre 10-12 instruções assembly<br />

<strong>de</strong> um programa <strong>de</strong> 895 instruções!<br />

A figura 1.32 mostra alguns dos resultados <strong>de</strong> profiling que<br />

obtemos <strong>para</strong> a or<strong>de</strong>nação bitônica. Esta figura nos mostra que<br />

os condicionais aninhados no laço mais interno do kernel pa<strong>de</strong>-<br />

42

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

Saved successfully!

Ooh no, something went wrong!