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.
contrada on-line 3 .<br />
Teorema 1.3.1 ( VARIÁVEL DIVERGENTE) Uma variável v ∈ P é<br />
divergente se e somente se, uma das condições abaixo for verda<strong>de</strong>ira:<br />
1. v = tid – ou qualquer outra variável que possui um valor<br />
pré-<strong>de</strong>finido e particular <strong>para</strong> cada thread, como por<br />
exemplo laneId.<br />
2. v é <strong>de</strong>finida por uma instrução atômica do tipo leia-modifiqueescreva,<br />
como por exemplo atomic { v = *a; *a =<br />
*a + b }.<br />
3. v possui uma <strong>de</strong>pendência <strong>de</strong> dados <strong>de</strong> alguma variável<br />
divergente.<br />
4. v possui uma <strong>de</strong>pendência <strong>de</strong> sincronização <strong>de</strong> alguma<br />
variável divergente.<br />
Antes <strong>de</strong> a<strong>de</strong>ntrar os pormenores <strong>de</strong> <strong>de</strong>pendências <strong>de</strong> dados<br />
e <strong>de</strong> sincronização, procuremos enten<strong>de</strong>r os dois primeiros<br />
itens do Teorema 1.3.1. A variável tid é divergente por <strong>de</strong>finição,<br />
uma vez que ela contém um valor diferente <strong>para</strong> cada<br />
thread. Já uma incremento atômico como atomic { v = *a;<br />
*a = *a + 1 } é executado exclusivamente por cada thread.<br />
Esta serialização faz com que cada thread obtenha um valor<br />
diferente <strong>para</strong> v, pois todas elas lêem – e alteram – o mesmo<br />
en<strong>de</strong>reço <strong>de</strong> memória e esta leitura não é simultânea.<br />
Dado um programa P, a variável v ∈ P possui uma <strong>de</strong>pendência<br />
<strong>de</strong> dados com relação à variável u ∈ P se P contém uma<br />
instrução que cria v e usa u. Por exemplo, na figura 1.36 nós<br />
temos que %i <strong>de</strong>pen<strong>de</strong> <strong>de</strong> %i1, <strong>de</strong>vido à função φ no bloco B1.<br />
Temos também que %i1 <strong>de</strong>pen<strong>de</strong> <strong>de</strong> %i, <strong>de</strong>vido à atribuição<br />
%i1 = %i + 1 no bloco B2. O problema <strong>de</strong> <strong>de</strong>terminar o fecho<br />
transitivo das <strong>de</strong>pendências <strong>de</strong> dados é um tipo <strong>de</strong> fatiamento<br />
<strong>de</strong> programas [40] e ele po<strong>de</strong> ser resolvido por uma simples<br />
busca em grafo. Este grafo, convenientemente chamado grafo<br />
<strong>de</strong> <strong>de</strong>pendência <strong>de</strong> dados, é <strong>de</strong>finido da seguinte forma:<br />
3 http://divmap.wordpress.com<br />
50