Quantificação da Localidade de Dados




Diz-se que existe uma dependência de dados entre duas referências em um programa, se existir um fluxo de controle entre elas e ambas se referirem à mesma posição de memória. Neste estudo, devido à análise de reutilização de dados, devemos considerar todas as referências feitas à memória, sejam elas por dependência de fluxo, antidependência, dependência de saída e dependência de entrada.

Seja um conjunto perfeitamente aninhado de loops, cujo interior contém referências atômicas em variáveis estruturadas:

for (i1=1; i1<=N1; i1++)
  for (i2=1; i2<=N2; i2++)
	...
    for (ik=1; ik<=Nk; ik++)
	    {	
                <S1>		
		...
             A[h(i1,i2,...,ik)]
                ...
        	<S2>		
		...
	     A[g(i1,i2,...,ik)]
		...
	    }

definimos:

· A: matriz de dimensão d

· h e g: mapeamento Zk em Zd

· C= , C Zk : espaço de iterações com tamanho igual a N =

· I = (i1,i2,...,ik) C : vetor de iteração que especifica os valores correntes dos índices dos loops

Há um tipo especial de dependência muito comum e que será usado na formulação matemática do resultado do custo da janela:

Definição 4: Dependência Uniformente Gerada é a dependência existente entre dois comandos S1 e S2 da forma:

<S1> ...... X(h(I) + d1)
<S2> ...... X(h(I) + d2)

onde h é um mapeamento de Zk em Zd.

A ordem em que as diferentes ocorrências da instrução S são executadas podem ser caracterizadas pela timing function, que é um mapeamento um-a-um entre C e {1,...,N}. A timing function é formalmente definida por:

T : C {1,... N} -> I
T(I) = T(i1,i2,...,ik) = I

onde Pj = I e Pk = 1. Em casos onde nenhuma ambigüidade é possível, o vetor de iterações I e o correspondente passo de tempo t = T(I) serão identificados.





Pedro Vaz Artigas
E-mail: artigas@lsi.usp.br

LSI Laboratory of Integrated Systems