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