• Nenhum resultado encontrado

Nesta Se¸c˜ao apresentaremos a forma final do algoritmo de mapeamento proposto (ver Algoritmo 4.4). Relembrando o caminho percorrido, partimos de um algoritmo de programa¸c˜ao dinˆamica sugerido por [6], onde o c´alculo do makespan ´e realizado de acordo com as dependˆencias das tarefas anteriores. Busca-se minimizar o makespan da instru¸c˜ao, considerando todos EPs poss´ıveis e respeitando a restri¸c˜ao do maior

CFC [1, 7, 8, 0] - inputs[0, 3] -outputs[2] dist(0,2)=4 dist(3,2)=3 TEP[1, 7, 8, 0][2]=4 TEP[1, 7, 8, 0][5, 6, 4, 2]=4 CFC [11] - inputs[11] -outputs[4] dist(11,4)=1 TEP[[11]][4]=1 TEP[[11]][5, 6, 4, 2]=1 CFC [3] - inputs[3] -outputs[1] dist(3,1)=1 TEP[[3]][1]=1 TEP[[3]][1, 7, 8, 0]=1 CFC [5, 6, 4, 2] - inputs[1, 8, 11] -outputs[9, 10, 12] dist(1,9)=1 dist(8,9)=1 dist(11,9)=2 TEP[5, 6, 4, 2][9]=2 dist(1,10)=3 dist(8,10)=3 dist(11,10)=4 TEP[5, 6, 4, 2][10]=4 dist(1,12)=2 dist(8,12)=2 dist(11,12)=3 TEP[5, 6, 4, 2][12]=3

TEP[5, 6, 4, 2][10,12]= max {TEP[5, 6, 4, 2][10] , TEP[5, 6, 4, 2][12]} = 4

Figura 4.17: C´alculo dos Tempos de Execu¸c˜ao Personalizados do grafo da Figura 4.16.

makespan da instru¸c˜ao antecessora.

Al´em disso, introduzimos prioridades na fila de instru¸c˜oes prontas, de acordo com as pol´ıticas descritas na Se¸c˜ao 4.4.1. Escolhemos utilizar a pol´ıtica C6. O c´alculo das prioridade e a prioriza¸c˜ao s˜ao realizados nos passos 3 e 9 do Algoritmo 4.4, respectivamente

Em seguida, adaptamos o algoritmo inicial para considerar a comunica¸c˜ao inter- EP. Por isso verificamos se a instru¸c˜ao ser´a alocada ao mesmo EP da instru¸c˜ao antecessora e, em caso positivo, acrescentamos a latˆencia de comunica¸c˜ao L. Este procedimento ´e expresso nos passos 17 a 20 do Algoritmo 4.4.

Depois, por ter de lidar com grafos que possuem ciclos, propusemos o agrupa- mento de instru¸c˜oes que pertencem a uma mesma CFC. Com isso transformamos o grafo com ciclos em grafo ac´ıclico. Para encontrar as Componentes Fortemente Conexas do grafo utilizamos o Algoritmo de Kosaraju-Sharir (passo 1). Em seguida, constru´ımos o grafo ac´ıclico G0 (passo 2 ).

E por fim, realizamos o c´alculo Tempos de Execu¸c˜ao Personalizados (passo 4), para obter uma melhor estimativa do tempo de execu¸c˜ao de uma CFC, em rela¸c˜ao `

as suas sucessoras. Note que no passo 16, “M SIj0 ⇐ M SIj − T Ej + T EP j, i”, ´e

descontado o tempo de execu¸c˜ao da instru¸c˜ao (somat´orio dos tempos de execu¸c˜ao de cada instru¸c˜ao da CFC de j) e ´e acrescido o Tempo de Execu¸c˜ao Personalizado, justamente para personalizar o makespan para a CFC j.

Algoritmo 4.4 Forma final do algoritmo de gera¸c˜ao de mapeamento com as adap- ta¸c˜oes propostas.

Entrada: Programa Dataflow descrito por G(I, E), os Elementos de Processamento P , os tempo de execu¸c˜ao das tarefas T Ei, a latˆencia de comunica¸c˜ao inter-EP

L e os operandos iniciais O Sa´ıda: Um mapeamento M (I → P )

1: Encontrar CFCs em G (Algoritmo de Kosaraju-Sharir)

2: Gerar Grafo Ac´ıclico G0 a partir das CFCs

3: Calcular Prioridades das CFCs (Fan-in, Fan-out, Altura)

4: Calcular Tempos de Execu¸c˜ao Personalizados, T EPi

5: Iniciar lista de CFCs prontas

6: para todo CFC i ∈ prontas fa¸ca

7: M SIi ⇐ T Ei

8: enquanto Existirem CFCs prontas a serem escalonadas fa¸ca

9: Remover a CFC i ∈ prontas de maior Prioridade

10: mapear(i)

11: Adicionar a prontas CFCs que foram liberadas ap´os mapeamento de i

12: fim enquanto

13: procedimento mapear(i)

14: para todo EP p ∈ P fa¸ca

15: para todo CFC j imediatamente antecessoras a i fa¸ca

16: M SIj0 ⇐ M SIj − T Ej + T EP j, i

17: Se j est´a mapeada em p ent˜ao

18: M axM SIp ⇐ max{M SIj0, M SPp}

19: sen˜ao

20: M axM SIp ⇐ max{M SIj0 + (L − 1), M SPp}

21: M inM axM SI ⇐ min{M axM SIp}

22: M SIi ⇐ M inM axM SI + T Ei

23: M SPp ⇐ M SIi

24: Mapear i no EP p onde M inM axM SI ´e m´ınimo

Cap´ıtulo 5

Experimentos e Resultados

Neste Cap´ıtulo apresentaremos um estudo comparativo entre algoritmos de mapea- mento e avaliaremos o Algoritmo proposto. Come¸caremos descrevendo a metodolo- gia utilizada nos experimentos. Em seguida, apresentaremos cada um dos algoritmos de mapeamento que comparamos no estudo. Tamb´em descreveremos o conjunto de programas Dataflow implementados que serviu de benchmark. Por fim, apresenta- remos os resultados obtidos.

5.1

Metodologia

Para testar o algoritmos de mapeamento precis´avamos de um conjunto de programas Dataflow representativo. Buscamos na literatura e em [6] ´e utilizado um conjunto de grafos ac´ıclicos gerados aleatoriamente. N˜ao seria adequado utilizar esta aborda- gem aqui, justamente porque o algoritmo que projetamos tamb´em ´e destinado para lidar com ciclos. J´a em [7], os autores utilizaram trechos de programas do SpecInt e do SpecFP, mas por n˜ao possuirmos um ambiente de testes compat´ıvel com o do WaveScalar, seria dif´ıcil adaptar esses programas. Por isso, optamos por implemen- tar o nosso pr´oprio conjunto de benchmarks. Foram considerados 13 programas de testes e ser˜ao descritos na Se¸c˜ao 5.3.

Para montar conjunto de benchmarks, primeiramente implementamos os progra- mas na linguagem C. Depois utilizamos o compilador Couillard para compilar os programas. Ele recebe como entrada um programa em C e gera o assembly da m´a- quina virtual Trebuchet e a descri¸c˜ao do grafo no formato Graphviz (arquivo .dot). Implementamos um conversor que, dado um grafo no formato Graphviz, faz a conver- s˜ao para o arquivo de entrada do Simulador (arquivo .sim). Com isso, conseguimos rodar os programas em C em nosso Simulador. Vale lembrar que compilador Couil- lard ´e voltado originalmente para utiliza¸c˜ao na m´aquina virtual Trebuchet e por isso possui algumas limita¸c˜oes para o nosso ambiente (ver Se¸c˜ao 2.2.3).

instru¸c˜oes que n˜ao estavam presentes no programa original, como a instru¸c˜ao OUT (sa´ıda de dados). Atrav´es dela foi poss´ıvel comparar os resultados da sa´ıda do Simulador, com a sa´ıda do programa em C e garantir a correta implementa¸c˜ao do programa.

O nosso algoritmo foi implementado, bem como suas varia¸c˜oes. Ent˜ao, buscamos outros algoritmos de mapeamento para servir como base de compara¸c˜ao. Atrav´es da descri¸c˜ao em [7], foi poss´ıvel implement´a-los. Ao todo foram considerados 7 algoritmos (ver Se¸c˜ao 5.2). Assim, pudemos aplicar os algoritmos de mapeamento nos programas de benchmarks e avaliar os resultados.

Tamb´em precis´avamos testar como os algoritmos reagiriam ao aumento de latˆen- cia da comunica¸c˜ao inter-EP, L. Isto ´e, aumentando o custo de comunica¸c˜ao ente EPs, como os algoritmos de mapeamento iriam se comportar. Lembrando que L ´e um parˆametro do Simulador. Por isso, fizemos 15 execu¸c˜oes, variando a latˆencia de 1 a 15 ciclos de m´aquina. Como os resultados se mostraram lineares, vamos discutir 3 amostras (5, 10, 15 ciclos), para indicar como a tendˆencia do aumento da latˆencia impacta nos resultados. Maiores detalhes sobre a latˆencia ser˜ao discutidos na Se¸c˜ao 5.4.

Executando um programa no Simulador, podemos gerar traces de execu¸c˜ao e al- gumas medidas de interesse como a utiliza¸c˜ao dos EPs, quantidade de ciclos ociosos, m´edia de mensagens (operandos) enviados por ciclo, etc. No entanto, o objetivo do algoritmo de mapeamento ´e minimizar o tempo de execu¸c˜ao total do programa, em ciclos de m´aquina. Por isso, esta foi a medida comparada entre cada execu¸c˜ao. Assim, podemos comparar se um mapeamento gerado foi melhor que outro compa- rando o n´umero de ciclos de m´aquina que um programa executou, utilizando um determinado mapeamento e sob uma latˆencia L.

A Figura 5.1 ilustra o fluxo utilizado para a realiza¸c˜ao dos experimentos.

Arquivo .c Compilador Couillard Arquivo .dot Conversor Arquivo .sim Arquivo .sim Algoritmo Mapeamento Arquivo .sim + Mapeamento Simulador Tempo de Execução (ciclos)

Figura 5.1: Fluxo executado para avalia¸c˜ao de um programa em nossa plataforma de testes.

Documentos relacionados