• Aucun résultat trouvé

VI. ANALYSE DE LA PROPOSITION

III.2. La proposition de contrat standard de GNL pour les services de chargement

O algoritmo da seção anterior é uma maneira rápida para se calcular a quantidade de registradores de um comportamento sem precisar computar o tempo de vida das variáveis, diminuindo assim o custo do processamento. No entanto, como o objetivo desta abordagem também é o calculo dos multiplexadores no caminho de dados, é necessário realizarmos o mapeamento das variáveis para as unidades de armazenamento. Para isto implementamos o algoritmo left-edge, descrito no Capítulo 2, para realizar este mapeamento.

A Tabela 5.3 mostra os tempos de vida das variáveis, bem como os tempos iniciais de cada estado para o comportamento mapeado na Figura 5.5. A partir da Tabela 5.2 obtemos a coluna h(si), menor tempo de permanência no estado si. Acumulando

h(si) obtemos os tempos finais de cada estado, por exemplo, os estados s1 a s3 têm

tempos finais igual a zero (∑h(si) = 0), enquanto o estado s4 (∑(h(si) = 15)), assim nos

estados s1 a s3 o tempo de permanência acumulado foi zero, no estado s4 foi consumido

15 unidades de tempo até o seu término, logo o tempo final de s4 é o tempo final até o

estado s3 mais o tempo de permanência em s4, que é igual a 15. A coluna tempo inicial

acumulado é obtida pela subtração das colunas h(si) acumulado e h(si) para cada

estado si.

Tabela 5.3: Variáveis vivas por estados (tempo de vida das variáveis) para ΓΓ1

h(si) acumulado a b c d s1 0 0 0 s2 0 0 0 x x s3 0 0 0 x x s4 15 15 0 x x s5 0 15 15 x x s6 0 15 15 x x x s7 15 30 15 x x x s8 0 30 30 x s9 0 30 30 x x s10 15 45 30 x x s11 0 45 45 s12 0 45 45 s13 0 45 45

Estados h(si) Tempo inicial acumulado Variáveis

O tempo de vida de uma variável é determinado pela seqüência de estados (coluna variáveis na tabela) onde a mesma é marcada (viva). Dada a lista de variáveis de uma descrição comportamental e seus tempos de vida associados, o algoritmo left-

edge primeiro ordena a lista de variáveis em ordem ascendente, considerando o tempo

passado desde o início da execução do comportamento até o instante em que a variável se torna viva (coluna tempo inicial acumulado). O algoritmo realiza diversos passos sobre a lista ordenada obtida, examinando os tempos de vida das variáveis na ordem em que elas ocorrem na lista. Em cada passo o algoritmo aloca um novo registrador e atribui uma nova variável ao mesmo se o tempo de vida desta variável não se

sobrepõem aos tempos de vidas das variáveis já atribuídas àquele registrador. Estas variáveis atribuídas são eliminadas da lista ordenada de variáveis. O processo é repetido até que todas as variáveis tenham sido atribuídas aos registradores.

Aqui vamos ilustrar o algoritmo left-edge, através do comportamento da Figura 5.5, onde os tempos de vida são vistos na Tabela 5.3. O conjunto de variáveis é inicialmente ordenado de acordo com os tempos de vida resultando na lista L = {a, b, c,

d}. No primeiro passo, uma unidade de armazenamento R1 é alocada e a variável a é

atribuída a esta unidade. Percorrendo a lista L, observamos que todos os tempos de vida das demais variáveis se sobrepõem ao da variável a. Portanto, a unidade de armazenamento R1 consiste apenas da variável a e esta variável é retirada da lista L. No

segundo passo, a unidade de armazenamento R2 é alocada e b é atribuída à mesma.

Percorrendo a lista L, observamos que a variável d é a próxima variável que pode ser atribuída à unidade de armazenamento R2, já que seu intervalo de tempo de vida não se

sobrepõe ao da variável b, já atribuída a R2. Nenhuma outra variável tem um tempo de

vida que não se sobrepõe àqueles das variáveis b e d. Então, a unidade de armazenamento R2 consiste das variáveis b e d, e estas variáveis são retiradas da lista L.

No terceiro e último passo, a unidade de armazenamento R3 é alocada e a variável c é

atribuída à mesma.

Tabela 5.4: Resultado final do mapeamento das variáveis para os registradores para Γ1

a b c d R1 x R2 x x R3 x Unidades de armazenamento Variáveis atribuídas

A Tabela 5.4 mostra o resultado final do mapeamento das variáveis para os registradores para o comportamento da Figura 5.5, após a aplicação do algoritmo left-

edge. Verificamos que foi encontrado o mesmo resultado da abordagem anterior, isto é,

três unidades de armazenamento. Agora com maior custo computacional, já que foi necessária a computação do tempo de vida das variáveis.

A complexidade para a geração do grafo de estados da rede é O(K), K = { x | x ∈ • + ∧ 1 ≤ x ≤ T}. Para a definição dos tempos de vida das variáveis a complexidade

é O(K*P). Para a construção da lista ordenada de variáveis é O(V*logV) e finalmente para mapear as variáveis aos registradores é O(V*R), R = { y | y ∈ • + ∧ 1 ≤ y ≤ V}. Onde T representa o conjunto de transições, P é o conjunto de lugares, K é o conjunto de estados gerados, V ⊂ P é o conjunto de variáveis e R é o conjunto de registradores. Logo, a complexidade da abordagem proposta para o cálculo dos registradores pelo método baseado nos tempos de vida das variáveis é O(K + K * P + V*logV + V*R).

A seguir definiremos uma abordagem formal para o método descrito. Inicialmente definiremos variável. Uma mesma variável pode ser modelado em vários lugares, logo necessitamos de uma função que obtenha a variável desses lugares.

Definição 5.5 – Função Var e Conjunto de Variáveis: Seja VAR = {ph, ..., pl,

..., pn} o conjunto de lugares rotulados como variáveis e uma função de nomeação l.

l (VAR) → VI, onde VI = {pi.substringj.m | i, j, n ∈ +}. var : VI → VARIAVEL é uma

função que extrai uma sub-string um elemento do conjunto VI, onde var(pi.substringj.m)

= substringj e VARIAVEL = {substringj | j ∈ +} é o conjunto de variáveis.

Após obtermos as variáveis (conjunto VARIAVEL) do comportamento dado, precisamos definir uma matriz que contenha os tempos de vida das variáveis. Se um elemento da matriz contiver o valor 1 significa que a variável é viva (marcada) neste estado. A seqüência de marcas com valor 1 na coluna (entre os estados) determina o tempo de vida da variável.

Definição 5.6 – Matriz de Tempo de Vida de Variáveis: Seja N = (P, T, A, ω,

m0, f), uma rede de Petri marked graph temporizada marcada. Seja G(N) = (V, D, h) um

grafo de estados, onde V = S(N). Seja s = (m, n, r) o estado s da Rede de Petri

temporizada N, s ∈ S(N). Seja VARIAVEL = {substringj | j ∈  +} o conjunto de

variáveis do comportamento. MTVD: S × VARIAVEL → {0,1} é definida como uma matriz de tempo de vida de variáveis representando a marcação das variáveis em seus respectivos estados.

Sabemos que em uma unidade de armazenamento só poderá conter variáveis nas quais não há sobreposição de seus tempos de vida. Assim será necessário definir o que é não-sobreposição.

Definição 5.7 – Não-Sobreposição: Seja MTVD uma matriz de tempo de vida

de variáveis. Dizemos que o tempo de vida de uma variável vi não se sobrepõe ao tempo

de vida de uma variável vj sse não estiverem marcadas no mesmo estado, ou seja, se

MTVD[sk, vi] = 1 ⇒ MTVD[sk, vj] = 0 ∨ se MTVD[sk, vi] = 0 ⇒ MTVD[sk, vj] = 1, ∀ sk

S(N) ∧ ∀ vi, vj ∈ VARIAVEL.

A partir da MTVD (matriz de tempo de vida das variáveis) será feita a atribuição das variáveis às unidades de armazenamento quando satisfeita a condição de não- sobreposição dos tempos de vida das variáveis.

Definição 5.8 – Unidade de Armazenamento: Seja VARIAVEL = {substringj |

j ∈  +} o conjunto de variáveis do comportamento. Seja MTVD uma matriz de tempo de vida de variáveis. REG = {substringm | m ∈ +} é definido como uma unidade de

armazenamento obtida a partir de MTVD, na qual seus elementos são variáveis que não apresentam sobreposição dos seus tempos de vida, onde REG ⊆ VARIAVEL.

O número de unidades de armazenamento é obtido pela cardinalidade do conjunto das unidades de armazenamento somado à cardinalidade do conjunto de literais.

Definição 5.9 – Número de Unidades de Armazenamento: Seja REG =

{substringm | m ∈ } uma unidade de armazenamento. REGISTRADORES = {REGi | i

∈  +} é definido como o conjunto das unidades de armazenamento.

NREGISTRADORES = # REGISTRADORES + # LIT nos dá o número de Unidades de

Armazenamento necessário para implementar o comportamento de uma determinada especificação.

Documents relatifs