TerraME HPA - TerraLAB
Transcrição
TerraME HPA - TerraLAB
MINISTÉRIO DA EDUCAÇÃO E DO DESPORTO Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Programa de Pós-Graduação em Ciência da Computação PPGCC/UFOP SAULO HENRIQUE CABRAL SILVA TERRAME HPA: UMA ARQUITETURA DE ALTO DESEMPENHO PARA SIMULAÇÃO PARALELA DE MODELOS AMBIENTAIS Ouro Preto – MG 2014 SAULO HENRIQUE CABRAL SILVA TERRAME HPA: UMA ARQUITETURA DE ALTO DESEMPENHO PARA SIMULAÇÃO PARALELA DE MODELOS AMBIENTAIS Dissertação apresentada ao Programa de PósGraduação em Ciência da Computação da Universidade Federal de Ouro Preto como requisito para a obtenção do título de mestre em Ciência da Computação. Orientador: Tiago Garcia de Senna Carneiro Co-orientador: Joubert de Castro Lima Ouro Preto – MG Instituto de Ciências Exatas e Biológicas da UFOP 2014 4 Folha de aprovação DEDICATÓRIA Este trabalho é dedicado a Deus, que permitiu que tudo pudesse ser realizado. A minha mãe, Regina pelo apoio incondicional em todos os momentos. Ao meu pai, Edmar, pela compreensão e incentivo ao longo de minha trajetória. A toda a minha família, que me apoiaram de diversas maneiras durante essa importante etapa de minha vida. Ao meu orientador Tiago e Co-Orientador Joubert, por todos os valiosos ensinamentos, pelas oportunidades oferecidas e pela amizade, fundamentais na minha formação. Meu sincero obrigado e admiração sempre! AGRADECIMENTOS Agradeço primeiramente a Deus pelo dom da vida e por ser sempre meu guia em todos os momentos. A toda minha família. Em especial, aos meus pais, Edmar José Silva e Regina Célia Cabral Silva, por não medirem esforços em me ajudar a conquistar mais este objetivo, verdadeiramente são os maiores mestres que tenho, obrigado pela força, dedicação, amor e compreensão que me deram ao longo de minha vida. Aos meus amigos da República Molotov, peço obrigado a Deus todos os dias, por me ter concedido o privilégio de ter suas amizades. Aos meus amigos que durante a jornada me acompanharam nos momentos de descontração e sempre torceram pelo meu sucesso. Aos professores David Menotti, José Maria, Luiz Merschmann, Sica, Ricardo Rabelo, Andre Luiz Lins de Aquino. Em especial ao meu orientador Tiago Garcia de Senna Carneiro e meu Co-Orientador Joubert de Castro Lima, pela dedicação, preocupação e esforço para produzir um bom trabalho. Agradeço também a todos do laboratório TerraLAB, por me ajudarem a ter a visão além do alcance e a todos participaram dessa jornada comigo, ou antes dela forneceram me os meios para a travessia. À Universidade Federal de Ouro Preto (UFOP) por esta oportunidade. Aos professores do PPGCC que contribuíram em minha formação, Tiago Garcia de Senna Carneiro, Joubert de Castro Lima, Fabrício Benevenuto e Ricardo Rabelo. Ao Gabriel pela disposição em disponibilizar as máquinas para realização dos testes deste trabalho. Agradeço ao Conselho Nacional de Desenvolvimento Científico e Tecnológico, CNPq, pela infraestrutura fornecida para a realização do trabalho e a CAPES, pela bolsa concedida durante os anos do projeto. Agradeço ao INPE, pela parceria com o projeto e pelas experiências trocadas durante os anos de realização do trabalho. “Os homens conseguiriam muito mais coisas se julgassem menos coisas impossíveis!” (Malesherbes) RESUMO O contínuo aumento da complexidade dos modelos ambientais pode demandar o uso de múltiplos paradigmas de modelagem para descrever as interações entre sociedade e natureza. Além disto, o crescente volume de dados e de cálculos utilizados nestes modelos exige que as simulações tirem máximo proveito do paralelismo de hardware existente em arquiteturas multiprocessador e multicomputador. Neste contexto, este trabalho apresenta e avalia uma abordagem para o desenvolvimento e simulação de modelos ambientais concorrentes e baseados em múltiplos paradigmas. O objetivo principal é gerar simulações escaláveis e o objetivo secundário é produzir modelos concorrentes flexíveis. Isto é, modelos que possam ser facilmente verificados e evoluídos. A abordagem proposta consiste na tradução automatizada do código anotado do modelo sequencial em um código paralelo passível de ser executado por uma máquina virtual, cujo modelo de concorrência e mecanismo para balanceamento de carga independam dos paradigmas de modelagem utilizados. Para implementar esta abordagem, a plataforma de modelagem e simulação ambiental TerraME foi estendida de duas formas, dando origem a plataforma TerraME HPA (High Perfomance Architecture). Primeiro, a ela foi adicionada um pré-processador que traduz o código anotado dos modelos em programas concorrentes na linguagem de programação Lua. Depois, o interpretador Lua originalmente distribuído com o TerraME foi substituído pelo interpretador MOOM, também desenvolvido neste trabalho. O MOOM utiliza o mecanismo de bag-of-tasks para executar funções Lua em paralelo. Desta forma, ele reduz o nível de concorrência programado pelos modeladores e distribui a carga de trabalho das simulações entre os processadores disponíveis em hardware. Finalmente, vários benchmarks selecionados na literatura foram utilizados para avaliar o desempenho e a escalabilidade de diferentes plataformas de programação concorrente na linguagem Lua (ALua, Lane, Luaproc e MOOM) e de diferentes plataformas destinadas ao desenvolvimento simulações ambientais de alto desempenho: TerraME HPA, Repast HPC e D-MASON versões 1.5 e 2.1. Os resultados evidenciam que, quando comparados aos trabalhos correlatos, o interpretador MOOM e a plataforma TerraME HPA apresentaram uma escalabilidade muito boa em todos os cenários avaliados. As aplicações Lua resultantes desta abordagem são flexíveis, pois ao ignorar as anotações, os interpretadores permitem que elas sejam verificadas e evoluídas sequencialmente. Palavras-chave: Modelagem Ambiental, Computação de Alto Desempenho, Simulações Escaláveis, TerraME, Programação Concorrente em Lua ABSTRACT The continuous increase in the complexity of environmental models can require the use of multiple modeling paradigms to describe the interactions between society and nature. Moreover, the growing volume of data and calculations used in these models requires that the simulations take full advantage of existing hardware parallelism on multiprocessor and multicomputer architectures. In this context, this paper presents and evaluates an approach to the development and simulation of concurrent environmental models based on multiple paradigms. The main objective is to generate scalable simulations and the secondary objective is to produce flexible concurrent models. That is, models which can be easily verified and extended. The proposed approach consists in performing the automated translation of the annotated code from the sequential model into a parallel code that can be executed by a virtual machine, which concurrency model and mechanism for load balancing are independent of the modeling paradigms used in the models. To implement this approach, the modeling and simulation platform TerraME was extended in two ways, giving rise to the TerraME HPA (High Perfomance Architecture) platform. First, it was added a pre-processor that translates the annotated codes into concurrent programs on the Lua programming language. Then, the Lua interpreter originally distributed with TerraME was replaced by the interpreter MOOM, also developed in this work. The MOOM uses the bag-of-tasks mechanism to run Lua functions in parallel. Thus, it reduces the level of concurrency programmed by modelers and distributes the simulation workload among the processors available in hardware. Finally, a number of benchmarks selected from literature were used to evaluate the performance and scalability of different platforms for concurrent programming in Lua (ALUA, Lane, Luaproc, and MOOM) and of different platforms for the development of high performance environmental simulations: TerraME HPA, Repast HPC and D-MASON versions 1.5 and 2.1. The results show that, when compared to related work, the interpreter MOOM and the platform TerraME HPA presents very good scalability in all evaluated scenario. The Lua applications resulting from this approach are flexible, because ignoring the annotations inserted in their codes, interpreters allow them to be verified and evolved sequentially. Keywords: Environmental Modeling, High Performance Computing, Scalable Simulations, TerraME, Concurrente Programming in Lua LISTA DE FIGURAS Figura 1. Modelo de alocação de threads Lua em threads do SO Figura 2. Código de uma aplicação Lanes Figura 3. Exemplo de uso do projeto Rings Figura 4. Exemplo de uso Lanes com o módulo Linda para compartilhamento de variáveis globais Figura 5. Exemplo de uso do middleware MOOM Figura 6. Seções críticas podem controlar o acesso concorrente a variáveis compartilhadas em diferentes granularidades Figura 7. Aplicação MOOM com utilização de seção crítica para acesso a variáveis compartilhadas Figura 8. Etapa de pré-compilação do interpretador MOOM Figura 9. Exemplo de Código traduzido para chamadas que podem ser interpretadas por Lua Figura 10. Divisão em segmentos do calculo do Fractal de Mandelbroat Figura 11. Implementação paralela do Fractal de Mandelbroat(500 x 500) sobre o MOOM Figura 12. Implementação paralela do problema dos N corpos sobre o middleware MOOM Figura 13. Resultado dos experimentos com benchmark dos Fractais de Mandelbroat Figura 14. Tempo médio de execução do benchmark N-Body Figura 15. Escalabilidade da plataforma Lanes para os benchmarks Mandelbroat e N-Body Figura 16. Escalabilidade da plataforma ALua para o benchmark Mandelbroat Figura 17. Escalabilidade da plataforma MOOM para os benchmarks Mandelbroat Figura 18. Comunicação entre os agentes remotos Figura 19. Arquitetura do plataforma TerraME HPA Figura 20. A máquina virtual TerraHPA para simulação de modelos ambientais concorrentes. Figura 21. Atualização concorrente de um espaço celular Figura 22. Execução modelo presa predador em TerraML Figura 23. TROLL simulation runtime Figura 24. Tempo de execução modelo boids para as plataformas DMASON e versão 1.5 e 2.1 Figura 25. Tempo de execução modelo boids na plataforma TerraME HPA Figura 26. Escalabilidade das plataformas D-MASON Figura 27. Consumo de memória do modelo boids nas plataformas TerraME HPA e D-MASON versões 1.5 e 2.1 Figura 28. Tempo de execução do modelo rumor nas plataformas Repast HPC e TerraME HPA em diferentes cenários Figura 29. Variação do speedup das plataforma Repast HPA (a) e TerraME HPA (b)] Figura 30. Consumo de memória do modelo rumor nas plataformas TerraME HPA e Repast HPC LISTA DE TABELAS Tabela 1. Tabela comparativa dos middlewares Lua para alto desempenho Tabela 2. Tabela comparativa das plataforma de modelagem para alto desempenho LISTA DE SIGLAS E ABREVIATURAS ABM – Agent Based Model AOI – Area of Interest API – Application Programming Interface HPA – High Performance Architecture HPC – High Performance Computing MPI – Message Passing Interface TICK - Unit of arbitrary time measurement STL - Standard template library LISTA DE CÓDIGOS Sumário 1 Introdução ................................................................................................................. 4 2 Programação concorrente em Lua sobre Arquiteturas de Hardware multiprocessAdas ............................................................................................................. 9 2.1 Introdução ......................................................................................................... 9 2.2 Trabalhos correlatos ....................................................................................... 12 2.2.1 Escolanomento de processos ...................................................................... 12 2.2.2 Comunicação entre processos ..................................................................... 15 2.2.3 Sincronização de processos ........................................................................ 17 2.2.4 Resumo ....................................................................................................... 17 2.3 O Middleware MOOM ................................................................................... 18 2.3.1 Resquisitos de software .............................................................................. 18 2.3.2 Interface para programação de aplicações concorrentes ............................ 19 2.3.3 Balanceamento de carga baseado no mecanismo de bag-of-tasks ............. 24 2.4 Experimentos para análise de desempenho .................................................... 25 2.4.1 O conjunto de Mandelbroat ........................................................................ 25 2.4.1 O Problema dos N corpos ........................................................................... 27 2.5 Resultados alcançados .................................................................................... 28 2.6 Considerações finais ....................................................................................... 32 3 Escalabilidade das Plataformas para Modelagem e Simulação Ambiental sobre Arquiteturas de Hardware Multiprocessadas ................................................................. 34 3.1 Introdução ....................................................................................................... 34 3.2 Trabalhos Relacionados .................................................................................. 39 3.3 O TerraME HPA ............................................................................................. 44 3.3.1 A plataforma de simulação TerraME ......................................................... 44 3.3.2 Arquitetura de Software.............................................................................. 45 3.4 Exemplos de modelos concorrentes em TerraME HPA ................................. 48 3.5 Experimentos para análise de desempenho .................................................... 50 3.5.1 Desenho Experimental ................................................................................ 51 3.5.2 Os Modelo BoidS ....................................................................................... 52 3.5.3 Modelo Rumor............................................................................................ 53 3.5.4 O modelo TROLL ...................................................................................... 54 3.6 Resultados....................................................................................................... 54 3.6.1 Resultados para o modelo TROLL ............................................................. 55 3.6.2 Resultados para o modelo Boids ................................................................ 55 3.6.3 Resultados para o modelo Rumor............................................................... 58 3.7 Discussão dos resultados e trabalhos futuros ................................................ 61 4 Considerações finais ............................................................................................... 65 5 Referências ............................................................................................................. 66 3 1 INTRODUÇÃO Governos, pesquisadores e empresários precisam de ferramentas de modelagem computacional capazes de capturar a dinâmica e o padrão espacial das mudanças às quais os sistemas Terrestres estão submetidos (Turner, 1995). Os sistemas Terrestres englobam os sistemas naturais, os sistemas sociais e as interações entre sociedade e natureza. Diversos estudos apontam as ações humanas como a causadora de 95% das alterações dos biomas (Salazar, et al., 2007), atingindo proporções sem precedentes na história da civilização (Vitousek, et al., 1997) (Jobbágy, 2005). Diante deste cenário, diversos setores da sociedade precisam fornecer respostas aos desafios científicos e tecnológicos ligados ao entendimento do funcionamento dos sistemas Terrestres e dos impactos causados pelas mudanças a que estão submetidos. Este conhecimento pode servir como base inicial para o planejamento e definição de políticas públicas (Organization World Health, 1986). O crescente aumento de complexidade dos modelos ambientais utilizados para simulação das interações entre sociedade e natureza demanda cada vez mais tempo e recursos computacionais para seu processamento. Atualmente, este fato dificulta e pode inviabilizar determinadas pesquisas. No laboratório TerraLAB da UFOP, um experimento que usa o modelo TROLL (Chave, 1999) para simulação do crescimento de florestas tropicais em cenários de mudanças climáticas tem consumido dezenas de dias mesmo quando executado em hardware de alto desempenho (Lanna, 2012). Para simulação das mudanças de uso de cobertura do solo na Amazônia, o Instituto Nacional de Pesquisas Espaciais (INPE) precisa representar o espaço em grades celulares de altaresolução (25 x 25 m) e considerar processos e atores que atuam em diversas escalas, dando origem a modelos que a cada ciclo de simulação processam volumes massivos de dados (Aguiar, 2006). A tendência é que os modelos ambientais se tornem mais custosos em termos computacionais por considerarem cada vez mais fatores direcionadores das mudanças dos sistemas Terrestres e devido ao aumento de complexidade destes fatores (Lisa, 2013). Por isto, é necessário desenvolver métodos e ferramentas que permitam a construção de simulações de alto desempenho e que, ao mesmo tempo, não demandem de seus usuários profundo conhecimento sobre as técnicas de programação paralela ou distribuída. Apesar da otimização do desempenho de simulações comumente demandar a customização dos simuladores e dos modelos para execução em arquiteturas de 4 hardware específicas, os modelos ambientais são comumente desenvolvidos por equipes multidisciplinares, envolvendo especialistas com pouco domínio das técnicas de programação de computadores: ecologia, biologia, geografia, antropologia, etc. A paralelização ou distribuição dos modelos, mesmo quando implementada por programadores profissionais, costuma resultar em modelos menos legíveis, que misturam regras de simulação que pertencem ao domínio de aplicação com instruções para distribuição da carga de trabalho entre processadores. Desta forma, os modelos tornam-se mais difíceis de serem entendidos e verificados por equipes multidisciplinares. Por isto, as plataformas de modelagem ambiental precisam balancear em suas interfaces com o usuário (linguagem de programação ou interface gráfica) a facilidade oferecida para expressar as regras do domínio de aplicação e o controle sobre particionamento e distribuição do modelo entre processadores. Pois, quanto mais próximo do domínio do problema for a interface, mais intuitivo será modelar as regras do sistema em estudo. Em contrapartida, quanto mais próximo a interface com o usuário for da arquitetura de hardware, mais fácil será obter uma simulação de alto desempenho. Neste cenário, plataformas, como NetLogo (Tisue, 2004), STELLA (Roberts, 1983) e Vensim (Eberlein, 1992), apresentam como grande diferencial interfaces gráficas (GUI) que permitem ao usuário desenvolver modelos de forma rápida e intuitiva. Plataformas como Repast HPC (North, et al., 2006) e D-MASON (Cordasco, et al., 2012) têm como diferencial os serviços semi-automatizados para particionamento e distribuição dos modelos. Uma característica comum entre as plataformas citadas anteriormente é o fato das mesmas limitarem-se ao uso de apenas um paradigma de modelagem. Um paradigma de modelagem determina a ontologia que pode ser utilizada para representar um fenômeno e as regras que o governam. Entre os paradigmas de modelagem ambiental estão: (I) o paradigma baseado em autômatos celulares (CA), no qual os sistemas naturais e sociais são representados por um conjunto de máquinas de estados finitos, organizadas em uma estrutura de grade e conectadas pelas relações de vizinhanças (von Neumann, 1966) (Batty, 2012) (Couclelis, 1997); (II) o paradigma de Dinâmica de Sistemas, no qual os sistemas são modelados como estoques de energia interligados por fluxos que transportam energias entre eles (Von Bertalanffy, 1952) (Meadows, 2008) (Costanza, 2004); (III) o paradigma de Múltiplos Agentes, no qual os sistemas são representados 5 por sociedades de agentes, em que cada agente representa um indivíduo autônomo capaz de perceber e alterar o ambiente em que está imerso e de se comunicar com outros agentes (Wooldridge, 1995) (Deadman, 2004); (IV) o paradigma de Álgebra de Mapas, no qual as mudanças pelas quais passam os sistemas Terrestres são representadas por uma sequência de operações sobre mapas. Cada mapa é representado por uma grade numérica na qual cada valor codifica propriedades de uma porção do espaço, como cobertura do solo, altimetria ou umidade (Tomlin, 1990) (Karssenberg, et al., 2001) (Soares, 2001); (V) paradigma de Especificação de Eventos Discretos (DEVS) onde as mudanças são modeladas por uma sequência de eventos discretos. Cada evento corresponde a uma mudança no estado do sistema que ocorreu em um tempo t da simulação (Zeigler, 2005) (Wainer, 2006). Infelizmente, o aumento de complexidade dos modelos ambientais também implica que o uso de apenas um paradigma de modelagem, dificilmente, será suficiente para modelar com facilidade as nuances de um problema. A escolha de um paradigma determina os conceitos que podem ser utilizados para representar o estado do modelo e a lógica utilizada para descrever as regras de simulação. Por isto, restringir o modelador a utilizar apenas um paradigma é reduzir seu poder de abstração no ato da modelagem do problema. O uso de um paradigma de modelagem cuja ontologia é distante da natureza do problema implica no aumento do esforço do modelador para construir o modelo. Por exemplo, simular uma sociedade de indivíduos colaborativos usando o paradigma de Dinâmica de Sistemas. Neste contexto, a plataforma de modelagem TerraME (Carneiro, 2013) permite o uso simultâneo de múltiplos paradigmas na construção de um modelo. Porém, não provê suporte para computação de alto desempenho. De uma forma geral, o paradigma utilizado na modelagem influencia a maneira na qual um modelo é particionado e distribuído entre os processadores, determinando o desempenho deste modelo. Nos modelos de larga escala, é comum que cada processador seja utilizado para simular uma região distinta do espaço geográfico. Nos modelos baseados em CA, as regras baseadas nas relações de vizinhanças poderão exigir comunicação entre processadores e estratégias de sincronização são necessárias para que as computações sejam coerentes. Nos modelos de múltiplos agentes, é comum que as ações de um agente dependam de sua localização geográfica e das propriedades locais do espaço. Por isto, cada agente é simulado pelo processador que gerencia os 6 dados da região onde ele está localizado. A concentração de agentes em uma determinada região pode, portanto, desbalancear a carga de trabalho entre os processadores. No entanto, esta estratégia de distribuição dos agentes diminui a necessidade de comunicação entre processadores. Estas questões tornam desafiante o desenvolvimento de plataformas de modelagem que ofereçam serviços para o particionamento automatizado dos modelos e serviços para a distribuição balanceada das simulações. Se o modelo ambiental sendo simulado faz uso de múltiplos paradigmas de modelagem, este desafio é ainda maior. Neste contexto, este trabalho apresenta e avalia uma abordagem para a simulação paralela de modelos ambientais baseados em múltiplos paradigmas. Este é um primeiro passo na direção de responder aos desafios expostos. O objetivo principal é desenvolver uma arquitetura de software escalável que seja capaz de, dentro de um limite de tempo estabelecido, simular instâncias maiores dos modelos mediante a adição de novos processadores à infraestrutura de hardware. Além disto, é objetivo secundário deste trabalho prover uma solução que permita que as regras de simulação do modelo paralelo sejam executadas e analisadas sem a influência das regras para particionamento e distribuição da computação. Desta maneira, permitir que os modelos possam ser facilmente verificados através da comparação dos resultados produzidos pelas versões concorrentes com aqueles produzidos pela execução sequencial do modelo. Para atingir seus objetivos, este trabalho combinou as técnicas de anotação e de bag of tasks para estender a plataforma de modelagem TerraME e produzir uma solução flexível, intuitiva e escalável ao problema - a arquitetura de simulação de alto desempenho chamada TerraME HPA (High Performance Architecture). Esta arquitetura foi avaliada em experimentos para análise de desempenho que permitiram compara-la a outras encontradas na literatura. Os experimentos realizados para avaliação da arquitetura TerraME HPA mostraram que ela teve boa escalabilidade na simulação de todos os modelos utilizados como benchmarks. A sobrecarga gerada pelos mecanismos para controle da simulação paralela é pequena. Por outro lado, a escalabilidade da plataforma D-MASON é severamente limita pelo desbalanceamento da carga de trabalho das simulações entre os processadores disponíveis em hardware. A plataforma Repast HPC escalou bem para instâncias menores dos benchmarks. Porém, assim como no D-MASON e ao contrário 7 do desejado, a escalabilidade das simulações diminui à medida que o número de agentes concorrentes aumenta. O TerraME HPA também foi avaliado em um estudo de caso real (Lanna, 2012), no qual o modelo TROLL (Chave, 1999) foi utilizado para simular a resposta da Floresta Amazônica às mudanças globais. No TROLL, a floresta é representada por um CA tridimensional no qual regras baseadas em vizinhanças, em equações diferenciais e em processos estocásticos interagem e determinam vários pontos de sincronização. A versão paralela do modelo TROLL foi implementada pelos autores deste trabalho que verificaram que os resultados produzidos por esta versão são idênticos àqueles gerados pela versão sequencial do modelo. Ao utilizar a versão paralela disponibilizando 8 threads, foi possível obter uma redução de aproximadamente 55% do tempo de processamento. O restante deste texto esta estruturado da seguinte forma: O Capítulo 2 detalha como as técnicas de anotação e bag of tasks foram combinadas para produzir um middleware para programação concorrente na linguagem Lua. A linguagem Lua é utilizada para a codificação de modelos ambientais na plataforma TerraME. Também é apresentada a análise de experimentos que relacionam o desempenho deste middleware com outros encontrados na literatura. O Capítulo 3 mostra como o middleware MOOM, apresentado no Capítulo 2, é utilizado pela arquitetura TerraME HPA para permitir a simulação paralela de modelos ambientais de larga escala. É feita uma análise comparativa entre o desempenho de modelos ambientais implementados em TerraME HPA e versões implementadas em outras plataformas de modelagem ambiental que suportam programação concorrente. No Capítulo 4, as considerações finais do trabalho são apresentadas. 8 2 2.1 PROGRAMAÇÃO CONCORRENTE EM LUA SOBRE ARQUITETURAS DE HARDWARE MULTIPROCESSADAS Introdução O projeto de linguagens de programação envolve o balanço entre simplicidade de desenvolvimento versus desempenho das aplicações. Linguagens compiladas (C++, Fortran, ou COBOL) são geralmente complexas e apresentam um desempenho muito superior ao das linguagens interpretadas (Lua, Lisp, Tcl ou Pearl) (Alioth, 2013). Estas Linguagens compiladas oferecem otimizações em tempo de compilação e permitem chamadas diretas ao Sistema Operacional (SO) sem qualquer tradução intermediária das instruções que formam a aplicação. Linguagens interpretadas oferecem simplicidade e flexibilidade no desenvolvimento de aplicações, além de portabilidade através de suas máquinas virtuais, vide o projeto da linguagem Java. Por esta razão, as linguagens compiladas são comumente utilizadas nos núcleos das aplicações para a implementação de seus serviços, enquanto as linguagens interpretadas são usadas para exportar as API (Application Programming Interface) das aplicações, permitindo que elas sejam estendidas ou customizadas para a solução de diferentes problemas em um mesmo nicho. Neste contexto, a linguagem Lua é utilizada por fabricantes mundiais de jogos (World of Warcraft, 2008) e simuladores científicos (Carneiro, et al., 2013), para permitir a rápida prototipagem de novas aplicações (jogos ou modelos computacionais) pelo reuso dos serviços de alto desempenho oferecidos pelo núcleo destes produtos, normalmente escritos em C ou C++. Apesar da oferta de suporte nativo à programação paralela ser uma forma de melhorar o desempenho das linguagens interpretadas sobre arquiteturas multiprocessadas, Lua não oferece tal suporte. O conceito de corotinas presente em Lua não permite que o paralelismo de hardware seja explorado (Moura, et al., 2009), pois não é possível executar várias corotinas simultaneamente. São várias as iniciativas de estender o interpretador Lua para permitir aplicações que tirem proveito de arquiteturas multiprocessadas. O projeto ALua oferece suporte a programação distribuída, permitindo que trechos de código Lua sejam definidos como mensagens que, ao serem recebidas, são executas pelo processo destinatário (Ururahy, et al., 1999) (Ururahy, et al., 2002). O projeto ConcurrentLua fornece serviços para 9 computação distribuídas de corotinas que se comunicam por troca de mensagens assíncronas (Chatzimparmpas, 2007). Contudo, nestes projetos não há suporte da execução de múltiplas threads em um único processador. No projeto Lanes (Kauppi, 2007) a linguagem Lua é estendida com o suporte a utilização de threads, permitindo o uso simultâneo de vários núcleos de processamento por funções que compartilham variáveis globais. Porém, as threads Lua são mapeadas diretamente em threads do SO. Isto pode levar à perda de desempenho caso seja disparado um número muito maior de threads Lua que o número de núcleos de processamento disponíveis. Este problema foi resolvido pela biblioteca LuaProc na qual um número de threads do SO definido pelo programador continuamente executa várias threads Lua que se comunicam por troca de mensagens (Skyrme, 2007). Apesar do modelo de programação por troca de mensagem trazer simplicidade ao programador, o tempo consumido na codificação e decodificação dos parâmetros das mensagens pode ser proibitivo, especialmente quando as variáveis cujo estado precisa ser compartilhado ocupam um grande volume de memória (centenas ou milhares de GB). Esta é uma situação comum em simulações ambientais e em jogos nos quais vários agentes precisam compartilhar o estado de uma variável global que representa a paisagem de um mundo virtual. Conforme são simulados, os agentes leem, processam e alteram concorrentemente as propriedades locais do espaço. Todas as plataformas atuais para programação concorrente em Lua exigem que o programador reimplemente as aplicações que serão paralelizadas utilizando a API que oferecem. A mistura do código que implementa as regras de negócio com as instruções para particionamento e distribuição das computações dificulta ou impede a verificação das aplicações sem a influência dos serviços para o controle de concorrência. No contexto de modelagem ambiental, no qual os modelos computacionais são vistos como aplicações construídas sobre a API dos simuladores, este problema deve ser evitado porque é mais simples corrigir os modelos por meio da análise de simulações sequenciais. É importante poder, a cada alteração no modelo, comparar facilmente os resultados de simulações paralelas com os resultados de simulações sequenciais. Na maioria dos projetos citados não há estratégias para o balanceamento de carga entre núcleos de processamento. Apenas o projeto Luaproc parece dirimir este problema ao mapear várias threads Lua em algumas thread do SO. Contudo, delega ao 10 programador a responsabilidade de determinar o número threads do SO que serão instanciadas. Diante do cenário exposto, este trabalho apresenta e avalia a abordagem do Multithread Object Oriented Middleware (MOOM), que é uma extenção do interpretador Lua com suporte a programação concorrente sobre arquiteturas multiprocessadas de memória compartilhada. No MOOM, o programador tem liberdade para particionar a aplicação de maneira adequada ao problema tratado e pode determinar em que granularidade o controle de acesso concorrente as variáveis compartilhadas será realizado. Para isto, o MOOM pré-compila anotações (Löhr, 1993) inseridas no código fonte das aplicações Lua. Isto é, comentários estruturados que definem trechos de código chamados tasks que devem ser executados em paralelo. As anotações também definem seções críticas nas quais a exclusão mútua no acesso a variáveis globais deve ser garantida, além de definirem pontos de sincronização entre as tasks. Desta maneira, ao ignorarem as anotações, qualquer interpretador Lua é capaz de executar sequencialmente as aplicações paralelas, sem qualquer influencia dos serviços para programação concorrente. O código Lua resultante da pré-compilação instancia as várias tasks Lua definidas pelo programador e as coloca em uma fila. Um número reduzido de threads de SO continuamente executam as tasks na ordem em que são enfileiradas. As threads de SO são automaticamente instanciadas em número igual ao número de núcleos de processamento disponíveis. Este mecanismo de execução chamado bag of task (Ananth Grama, 2003) promove o balanceamento de carga e evita que uma explosão de threads de SO degrade o desempenho do sistema, mesmo quando o programador instancia um número elevado de tasks Lua. Para avaliar a abordagem do MOOM, alguns benchmarks foram implementados no MOOM e nas plataformas de programação concorrente encontradas na literatura. Experimentos para coleta de métricas de desempenho foram realizados e uma análise comparativa é apresentada. Os experimentos mostram que o MOOM apresenta em média um desempenho entre 65 a 75% superior às demais soluções, quando uma 11 máquina com 16 núcleos de processamento, 64 GB de RAM e Sistema Operacional Linux Ubuntu versão 64 bits são utilizados. Este trabalho contribui ao fornecer uma abordagem eficiente e flexível na qual o paralelismo de hardware pode ser explorado por aplicações Lua que concorrentemente processam quantidades massivas de dados compartilhados. Eficiente porque o balanceamento de carga automatizado promove o bom desempenho das aplicações. Flexível porque as aplicações podem ser facilmente verificadas sem a influência do código para programação concorrente. O código fonte do midleware MOOM é aberto e distribuído gratuitamente junto ao ambiente de modelagem TerraME (www.terrame.org). O restante deste capítulo esta organizado da seguinte forma: A Seção 2.2 introduz o ambiente de execução da linguagem Lua e apresenta os trabalhos correlatos. A Seção 2.3 descreve a arquitetura e a implementação do middleware MOOM. Na Seção 2.4 os experimentos para análise de desempenho são detalhados. A seção 2.5 apresenta e discutes os resultados alcançados. Finalmente, as considerações finais deste capítulo são apresentadas na seção 2.6, apontando as direções futuras para o desenvolvimento do MOOM. 2.2 Trabalhos correlatos Esta seção discute como os trabalhos correlatos implementam programação concorrente em Lua, como os processos são escalonados, como os processos se comunicam e como são sincronizados. 2.2.1 ESCOLANOMENTO DE PROCESSOS Desde 2003, Lua permite programação concorrente não preemptiva, na qual funções denominadas corotinas utilizam colaborativamente um único núcleo de processamento. Como corotinas não podem ser executadas simultaneamente, não é possível tirar proveito do paralelismo de hardware. Para se comportarem como fluxos de execução independentes, as corotinas possuem sua própria pilha de execução (chamada estado Lua: lua_state), seu contador de programas, suas variáveis locais, e compartilham as variáveis globais de uma aplicação. No projeto Rings (Guisasola, 2007) as diversas pilhas de execução (lua_state) são organizadas segundo a arquitetura mestre-escravo. A pilha de execução chamada mestre pode solicitar que funções sejam executadas nas pilhas escravas. Essas executam 12 as funções e informam à mestre os valores de retorno. Não há suporte a programação multithread. Mestre e escravos executam colaborativamente, sem tirar proveito da disponibilidade de múltiplos núcleos de processamento. Figura 1. Modelo de alocação de threads Lua em threads do SO: (a) Modelo 1–1 utilizado no projeto Lanes. (b) Modelo 1–N utilizado no projeto LuaProc. Múltiplas pilhas de execução Lua são utilizadas pelos projetos Lanes (Kauppi, 2007) e Luaproc (Skyrme, 2007) para implementar threads internas ao ambiente de execução (interpretador) Lua. As threads Lua são executadas por múltiplas threads instanciadas no nível do SO. Desta maneira, estes projetos são capazes de explorar o paralelismo de hardware. No Lanes, cada thread Lua é mapeada diretamente em uma thread de SO. Caso o programador Lua instancie muito mais threads que o número de núcleos de processamento disponíveis, o alto nível de concorrência entre as threads de SO poderá degradar o desempenho da aplicação resultante e implicar em alto consumo de memória. No projeto Luaproc, o mecanismo de bag of tasks é utilizado para mapear threads Lua em thread de SO. Quando instanciadas, as threads Lua são colocadas em uma fila e executadas, em ordem, por um conjunto de threads de SO chamadas workers. O número de workers é definido à priori pelo programador. Desta maneira, independente do número de threads Lua instanciadas, haverá sempre um número fixo de workers as executando, evitando-se a degradação da aplicação e consumo desnecessário de memória. A Figura 1 ilustra ambos os cenários: (a) Lanes - relação 1 para 1 entre threads Lua e threads de SO; (b) Luaproc - relação N para 1 entre threads Lua e threads de SO. 13 No código da Figura 2 são criadas 100.000 threads em Lanes e, portanto, 100.000 de threads de SO. Supondo uma máquina com apenas dois núcleos de processamento, ocorrerá um número elevado de trocas de contexto desnecessárias durante a execução da aplicação, ocasionando baixo desempenho da mesma e consumo desnecessário de memória. O Lanes não interfere no nível de concorrência da aplicação do usuário e, portanto, requer programadores com profundos conhecimentos em programação concorrente para se evitar o problema exposto. Nos projetos onde o mecanismo de bag-of-taks é utilizado, um conjunto fixo de threads de SO, proporcional ao número de núcleos de processamento da máquina, excutam todas as threads Lua. Neste projeto há interferência no nível de concorrência da aplicação do usuário, evitando-se os problemas citados. ____________________________________________________________________________ require("lanes") tab_result = {} for indx = 1, 100000 do tab_result[indx] = 0 end function foo(par1) ...DO SOMETHING... end for indx = 1,100000 do tab_result[indx] = lanes.gen(foo)(indx) end for indx = 1, 100000 do print(tab_result[indx]) end ____________________________________________________________________________ Figura 2. Código de uma aplicação Lanes O projeto ConcurrentLua (Chatzimparmpas, 2007) permite que processos Lua possam ser executados de forma concorrente e distribuída. Processadores podem ser adicionados como nodes que servem à aplicação Lua. Um node é responsável pela execução de vários processos. Cada processo é implementado como uma extensão das corotinas e, portanto, executam de forma colaborativa (não preemptiva). Não há múltiplas threads por node. Desta forma, não é possível o uso eficiente de máquinas multicore. Cada processo Lua é associado a uma mailbox, que armazena as mensagens recebidas de outros processos. Um processo suspende sua execução quando sua mailbox estiver vazia. Desta forma, permite a execução de outro processo. Não há serviços para o balanceamento de carga entre os nodes da aplicação. 14 O middleware orientado a eventos ALua (Ururahy, et al., 1999) (Ururahy, et al., 2002) também permite o desenvolvimento de aplicações Lua distribuídas. O ALua é composto de processos chamados agentes. Cada agente executa em um computador da rede. Os agentes se comunicam utilizando mensagens assíncronas. Cada agente contém uma pilha de execução Lua (lua_state) e um evento interno em contínua execução que funciona com um dispatcher. Este evento é responsável por gerenciar a rede e a interface com outros agentes. A rede e a interface são os principais pontos de acesso aos serviços de um agente. Eles recebem trechos de código Lua que são escalonados na forma de eventos a serem executados. 2.2.2 COMUNICAÇÃO ENTRE PROCESSOS No projeto Rings os processos correntes se comunicam de uma maneira similar a chamada de procedimento remoto. O mestre envia o código da função a ser executada por um escravo e serializa seus parâmetros e valores de retorno. A Figura 3 ilustra o uso do projeto Rings em um exemplo no qual um escravo (ring S) inverte os elementos de uma tabela enviada elo mestre. ____________________________________________________________________________ require"rings" S = rings.new () data = { 12, 13, 14 } print(S:dostring ([[ local arg = {...} aux = {} for i, v in ipairs (arg) do table.insert(aux, 1, v) end return unpack (aux)]], unpack (data))) -- true, 14, 13, 12 S:close() ____________________________________________________________________________ Figura 3. Exemplo de uso do projeto Rings O projeto Lanes permite que threads Lua compartilhem variáveis globais por meio do módulo Linda. Threads Lua podem ler ou escrever em uma variável compartilhada de forma segura, por meio de operações set e get que executam de forma atômica, garantindo a exclusão mútua no acesso as variáveis que manipulam. Contudo, as variáveis devem ser criadas por meio da API do módulo Linda. Elementos de tipos compostos, como as tabelas, não podem ser escritos e lidos diretamente. É preciso ler toda a tabela para uma variável local, altera-la e então atualizar a tabela compartilhada. A Figura 4 exemplifica o uso deste módulo. No exemplo as funções producer e consumer são executadas em diferentes threads Lua. A função producer insere valores 15 na variável x após instancia-la em sua primeira iteração. A função consumer efetua a leitura da variável x. ____________________________________________________________________________ lanes = require "lanes" local linda = lanes.linda() local function producer( ) for i = 1, 100 do print( "sending: "..i ) linda:set( "x", i ) -- creating a global variable end return "end producer" end function consumer() while true do print("receiving") local val = linda:get( "x" ) if val == nil then print( "nil received" ) break else print( "received: "..val) break end end return "end producer" end temp1 = lanes.gen("1",consumer)() temp2 = lanes.gen("2",producer)() print(temp1..” ”..temp2) -- end application ______________________________________________________________________ Figura 4. Exemplo de uso Lanes com o módulo Linda para compartilhamento de variáveis globais A comunicação entre threads Lua no projeto Luaproc é feita através de troca de mensagens por meio de canais criados pelo usuário. Um canal pode ser utilizado por qualquer thread para enviar mensagens. Várias threads podem receber mensagens por um canal. Por isto, a thread remetente não tem como determinar aquela que receberá e executará uma mensagem enviada. Quando os resultados das computações de várias threads escravas precisam ser reunidos em uma única thread mestre, esta última aguarda sincronamente que estes resultados sejam recebidos por meio de um único canal. Este canal pode-se tornar um forte gargalo da aplicação. O projeto ConcurrentLua é baseado no modelo de troca de mensagens assíncronas. Processos existem para responder as mensagens que chegam a sua mailbox (Chatzimparmpas, 2007). O projeto ALua também segue este modelo de comunicação. 16 Porém, as mensagens são chamadas de eventos (Rodriguez, 1999). Nas aplicações em que uma quantidade massiva de dados precisa ser processada concorrentemente, o custo de comunicação pode reduzir substancialmente o desempenho da aplicação. 2.2.3 SINCRONIZAÇÃO DE PROCESSOS A sincronização é utilizada para que múltiplos processos envolvidos em uma computação reconheçam que a tarefa atribuída a cada um foi concluída e que o resultado conjunto pode ser utilizado em computações posteriores. Ela também é utilizada para garantir a exclusão mútua entre processos no acesso a recursos compartilhados. Quando o modelo de troca de mensagens é utilizado para comunicação, é comum que a troca de mensagens síncronas seja utilizada para este propósito. Um servidor utiliza esta estratégia para gerenciar o acesso feito por vários clientes a seus recursos. Quando o modelo de memória compartilhada é utilizado na comunicação, as variáveis compartilhadas devem ser acessadas dentro de seções críticas de código. O projeto Lanes oferece barreira de sincronização (join) para aguardar o resultado das funções executadas concorrentemente. No projeto Luaproc, as mensagens enviadas pelos canais são transmitidas de forma síncrona (receive). Uma única thread pode utilizar um canal de comunicação em um dado momento. Os projetos Alua e ConcurrentLua oferecem troca de mensagens síncronas e a função loop() que implementa uma barreira de sincronização. No projeto Rings, o escalonamento de processos acontece de forma colaborativa e não demanda controle de acesso concorrente a recursos compartilhados. 2.2.4 RESUMO A Tabela 1 sumariza as características relevantes que cada trabalho correlato possui, assim como suas limitações. Tabela 1. Tabela comparativa dos middlewares Lua para alto desempenho Asynchr. Mult. Mult. Flexible Shared 1-N thread Calls core Var. model computer Rings No No Yes No No No ConcurrentLua Yes No Yes No No No ALUA Yes No Yes No No No Lanes Yes Yes No No Yes No Luaproc Yes Yes No No No Yes 17 A primeira coluna da Tabela 1 (Asynchr. Calls), identifica quais soluções oferecem suporte a chamada de funções de forma assíncrona, ou seja, chamadas que não bloqueiam quem invocou a função, permitindo execuções concorrentes e escaláveis. A segunda coluna (Mult. Core) identifica as soluções que suportam execução de tarefas simultâneas em máquinas multicore que compartilham um sistema de memória principal. A coluna Mult. computer, identifica quais soluções executam estados Lua de forma distribuída, isto é, utilizando vários computadores de uma rede ou cluster. Não foram encontradas soluções híbridas na literatura, ou seja, solução distribuída que também permita multi-threading. A quarta coluna (Flexible), indica se o código da aplicação concorrente pode ser executada por interpretadores sequenciais, sem que a execução seja afetada pelos serviços para controle de concorrência. A quinta coluna, indica se as soluções avaliadas suportam variáveis compartilhadas. Por fim, na sexta coluna identificamos qual modelo de mapeamento foi utilizado para mapear threads Lua em threads de SO. 2.3 O Middleware MOOM Esta seção de texto apresenta a metodologia utilizada para o desenvolvimento do middleware MOOM. Os requisitos de software que justificaram as decisões de projeto são apresentados. A arquitetura de software é discutida. Os modelos para escalonamento, comunicação e sincronização de processos são descritos. A API baseada em anotações é detalhada junto com a estratégia utilizada para balanceamento de carga entre núcleos de processamento. 2.3.1 RESQUISITOS DE SOFTWARE O middleware MOOM deve oferecer serviços para o desenvolvimento de aplicações Lua nas quais um volume massivo de dados precisa ser compartilhado entre diversos fluxos de execução (threads) simultâneos. Jogos e simulações em que dados descritivos do mundo virtual são simultaneamente lidos, processados e alterados por vários agentes são bons exemplos de tais aplicações. Nestes casos, o mundo virtual comumente representa regiões geográficas de larga escala em altíssima resolução, resultando em volumes massivos de dados. Muitos modelos computacionais desenvolvidos na plataforma TerraME possuem estas características, como acontece nas simulações de mudanças de uso e cobertura do solo na Amazônia brasileira (Aguiar, 2006). 18 Estas aplicações são inerentemente complexas e, por isto, é ideal que possam ser verificadas sem a influência das instruções para sua paralelização. Desta maneira, os resultados produzidos pela versão concorrente de seu código fonte podem ser facilmente comparados com os resultados da versão sequencial. Ademais, como os usuários do middleware nem sempre são programadores experientes, é importante que ele ofereça serviços transparentes que evitem a degradação do desempenho do sistema devido ao elevado nível de concorrência programado, além de serviços para o balanceamento de carga de trabalho entre processadores. 2.3.2 INTERFACE PARA PROGRAMAÇÃO DE APLICAÇÕES CONCORRENTES Para conferir flexibilidade as aplicações MOOM e suavizar a transição da programação sequencial para programação paralela, o MOOM fornece uma API baseada no conceito de anotações. Anotações são comentários estruturados que são inseridos no código fontes das aplicações para informar ao compilador ou ao interpretador como tratar o código que as seguem (Biberstein, 2005). No MOOM, as anotações são utilizadas para definir funções que devem ser executadas em paralelo, barreiras de sincronização e seções críticas nas quais a exclusão mútua no acesso a variáveis compartilhadas deve ser garantida. _______________________________________________________________________________ function nested(p1) ...DO SOMETHING2... end function Test(par1) ...DO SOMETHING... for i=1,5 do --MOOM PARALLEL neted(par1) end --MOOM JOIN nested end --MOOM PARALLEL Test("hello1") --MOOM PARALLEL Test("hello2") --MOOM JOINALL _______________________________________________________________________________ Figura 5. Exemplo de uso do middleware MOOM A Figura 5 ilustra a utilização do MOOM. Devido à anotação PARALLEL, as chamadas à função Test são executadas em paralelo. A anotação JOINALL faz com 19 que, antes de terminar, o fluxo principal da aplicação aguarde o término das execuções paralelas de Test. O uso de anotações garante que aplicações MOOM sejam portáveis entre interpretadores Lua. Ao ignorar as anotações, os interpretadores executam a aplicação sequencialmente, sem qualquer influência das regras para sua paralelização, facilitando sua verificação. Para controlar o acesso concorrente a variáveis compartilhadas, o MOOM oferece as diretivas ACQUIRE e RELEASE que definem seções críticas nomeadas, conforme ilustra a Figura 6. Quando uma thread Lua entra na seção crítica "wholeTable" ao executar esta anotação "ACQUIRE wholeTable", nenhuma outra thread conseguirá executar uma seção crítica de mesmo nome, até que a thread que esteja em seu interior execute a anotação "RELEASE wholeTable" que determina o fim desta seção crítica. A Figura 6 ilustra o controle no acesso concorrente à tabela compartilhada Repository, dentro da seção crítica wholeTable, ou à apenas um de seus elementos, dentro de singleElement. A variável Repository é uma tabela unidimensional que armazena números inteiros em cada uma de suas posições. _______________________________________________________________________________ Repository = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } --(a) controlling access to all positions of Repository --MOOM ACQUIRE wholeTable for i = 1, 10 do Repository[i] = Repository[i] + 1 end --MOOM RELEASE wholeTable --(b)controlling access to just one position of Repository for i = 1, 10 do local singleElement = “repos_”..i; --MOOM ACQUIRE singleElement Repository[i] = Repository[i] + 1 --MOOM RELEASE singleElement end _______________________________________________________________________________ Figura 6. Seções críticas podem controlar o acesso concorrente a variáveis compartilhadas em diferentes granularidades. O MOOM implementa as seções críticas utilizando esperas condicionais ao invés de espera ocupada. Desta maneira, ao tentar entrar em uma seção crítica que esteja em execução, a thread Lua entra em estado de espera (wait) e aguarda, sem consumir CPU, até que a seção crítica seja liberada. Esta estratégia evita o desperdício de ciclos de processamento. 20 A Figura 7 ilustra uma aplicação bancária, na qual uma conta compartilhada é atualizada por 200 mil transações simultâneas. Valores positivos são considerados depósitos e valores negativos são débitos. A seção crítica "CriticSec" garante que os acessos simultâneos as variáveis globais ACCOUNT_BALANCE e TRANS_COUNTER resultem em computações coerentes (Andrews, 1983). _______________________________________________________________________________ -- initial bank account (shared variable) ACCOUNT_BALANCE = 0 -- transactions counter (shared variable) TRANS_COUNTER = 0 --vector of transactions values (shared variable) TRANSACTIONS = {} --number of transactions (shared variable) transNum = 200000 --generating random values of transactions for i = 1, numTrans do TRANSACTIONS[i] = math.random(-100,100) end --function to modify the account balance function doTransaction(value) --MOOM ACQUIRE CriticSec ACCOUNT_BALANCE = ACCOUNT_BALANCE + value TRANS_COUNTER = TRANS_COUNTER + 1 --MOOM RELEASE CriticSec end for indx = 0, transNum do --MOOM PARALLEL doTransaction( TRANSACTIONS[indx] ) end --MOOM JOINALL print("Final value of the bank account: ", ACCOUNT_BALANCE) print("Number of transactions: ", TRANS_COUNTER) _______________________________________________________________________________ Figura 7. Aplicação MOOM com utilização de seção crítica para acesso a variáveis compartilhadas. O middleware MOOM foi desenvolvido em C++ e, posteriormente, sua API registrada em Lua. Para oferecer uma API baseada em anotações, foi necessário o desenvolvimento de um pré-compilador para o código Lua anotado. Como pode ser observado na Figura 8, o pré-compilador recebe o código anotado (instrumented program) e efetua a tradução, convertendo todas as anotações em chamadas à API Lua do middleware MOOM. O código gerado (translated program) é então executado pelo interpretador Lua. 21 Figura 8. Etapa de pré-compilação do interpretador MOOM Para uma correta tradução, o pré-compilador precisa identificar os parâmetros das anotações. É preciso identificar o nome da função a ser sincronizada pela função JOIN e o nome das seções críticas definidas pelas anotações ACQUIRE e RELEASE. Para a anotação PARALLEL é preciso identificar o nome e os parâmetros da função invocada após o ponto da anotação e, em seguida, instanciar uma thread Lua que executará a função. Funções paralelas não podem retornar valores, elas são executadas assincronamente e, por isto, suas chamadas retornam imediatamente ao trecho de código que a invocou. Os valores computados por uma função paralela devem ser escritos em variáveis compartilhadas se necessários posteriormente. A Figura 9 ilustra o código Lua traduzido a partir do código anotado contido na Figura 7. _______________________________________________________________________________ -- initial bank account (shared variable) ACCOUNT_BALANCE = 0 --number of transactions in an account (shared variable) TRANS_COUNTER = 0 --vector of transactions values (shared variable) TRANSACTIONS = {} --number of executions (shared variable) transNum = 200000 --generating random values of transactions for i = 1, transNum do TRANSACTIONS[i] = math.random(-100,100) end 22 --function to modify the bank account function doTransaction(value) MOOM_ACQUIRE("CriticSec") BALANCE_ACCOUNT = BALANCE_ACCOUNT + value TRANS_COUNTER = TRANS_COUNTER + 1 MOOM_RELEASE("CriticSec") end for indx = 0,transNum do MOOM_PARALLEL("doTransaction",TRANSACTIONS[indx]) end MOOM_JOINALL() print("Final value of the bank account: "..ACCOUNT_BALANCE) print("Number of transactions: "..TRANS_COUNTER) _______________________________________________________________________________ Figura 9. Exemplo de Código traduzido para chamadas que podem ser interpretadas por Lua. Ao término da etapa de pré-compilação, o código traduzido é então carregado para a pilha de execução Lua (lua_state) da aplicação principal e começa a ser interpretado. Caso o interpretador encontre uma chamada a uma função da API do MOOM, o mesmo delega a execução de tal chamada à camada C++ do MOOM e continua a interpretar as demais instruções empilhadas na pilha principal. Todas as funções instrumentadas pela anotação MOOM PARALLEL são encapsuladas em uma thread Lua gerenciada pela camada C++ do MOOM. A lista abaixo resume as anotações que formam a API do MOOM: MOOM PARALLEL: Indica ao MOOM que a função a seguir deve ser executada de forma concorrente, como uma thread Lua. MOOM JOIN F(x): Deve ser utilizada para a sincronização de processos. Permite à tarefa que a executou aguardar pelo término a função concorrente F(x). MOOM JOINALL: Cria uma barreira de sincronização, fazendo a tarefa que executou aguarde pelo termino de todas as threads Lua instanciadas pelo MOOM. MOOM ACQUIRE criticalSec: Indica o início da seção crítica "criticalSec", isto é, um trecho de código no qual a exclusão mútua entre threads Lua é garantida. MOOM RELEASE criticalSec: Indica que o término da seção crítica "criticalSec", liberando-a para execução por outras threads Lua. 23 2.3.3 BALANCEAMENTO DE CARGA BASEADO NO MECANISMO DE BAG-OFTASKS Para evitar que um alto nível de concorrência degrade o desempenho da aplicação Lua, como pode acontecer na Figura 6 em que o usuário cria 200 mil threads Lua, o MOOM implementa o mecanismo de bag of tasks em sua camada C++. Este mecanismo é responsável por balancear a carga de trabalho entre os diversos núcleos de processamento disponíveis. Desta maneira, busca-se produzir aplicações escaláveis e de alto desempenho (Cirne, 2003) (Iosup, 2008). Da mesma maneira que outras abordagens encontradas na literatura, as threads Lua responsáveis pela a execução de funções concorrentes são representadas por uma pilha de execução Lua (lua_state), com o seu contador de programa e suas variáveis locais. Quando instanciadas, elas são inseridas em fila de threads Lua e permanecem aguardando por execução. Esta fila é chamada bag. O fluxo de execução principal da aplicação é tratado da mesma maneira, como qualquer outra thread. Quando o interpretador MOOM é colocado em execução, ele detecta o número de núcleos de processamento disponíveis e instancia uma thread de S.O., chamada worker, para cada núcleo. Os workers continuamente retiram threads Lua da bag e as executa de forma preemptiva segundo a política de escalonamento round-robin. As threads Lua cuja execução não findou são reinseridas na bag. Se a bag ficar vazia, os workers entram em modo de espera para que não consumam recursos. Os workers são reativados assim que alguma thread Lua for inserida na bag. Se durante sua execução, uma thread Lua tenta entrar em uma seção crítica que estiver ocupada, sua execução é interrompida e ela é inserida na fila de espera daquela seção crítica. Quando a seção crítica é liberada, todas as threads aguardando por ela são notificadas e tem sua execução retomada a partir do ponto de espera definido pela seção crítica. No MOOM, as funções concorrentes (threads Lua) são executadas de forma assíncrona. Para recuperar os valores computados por estas funções é necessário aguardar seu término por meio de barreiras de sincronização. Quando um worker inicia a execução de uma thread Lua, ele empilha os parâmetros e a função a ser executada na 24 pilha de execução local à thread Lua. Então, inicia a execução da função. Ao término da execução da função, os resultados são escritos nas variáveis compartilhadas. 2.4 Experimentos para análise de desempenho Esta seção apresenta o plano de experimentos utilizados para comparar o desempenho do middleware MOOM com desempenho dos trabalhos correlatos. Foram avaliados os projetos Luaproc, Lanes e Alua. O projeto Rings não foi avaliado porque não permite o aproveitamento do paralelismo de hardware. Como o escopo deste trabalho é produzir uma solução escalável para arquiteturas de hardware multicore, para efeitos de comparação, somente o projeto mais recente para arquiteturas multicomputador foi avaliado: ALua. Dois benchmarks do repositório The Computer Language Benchmarks Game (Alioth, 2013) foram utilizados. Um dos benchmarks utilizados implementa o conjunto de fractais de Mandelbroat (Pall, 2011) e o outro implementa o problema dos N Corpos (Newton, 1687). O objetivo é avaliar o desempenho das plataformas em problemas facilmente paralelizáveis (Mandelbroat), nos quais cada thread pode realizar as computações de forma independente, e em problemas que exigem muita sincronização, como o problema dos N corpos. Todos os testes foram realizados em uma máquina multicore com processador Intel Xeon 5500 series, com 16 núcleos de processamentos, 64 GB de RAM DDR2 1333 MHz. O Sistema Operacional utilizado foi o Ubuntu 12.04 versão 64 bits. Para cada benchmark, foram realizados 4 experimentos que consideraram instâncias de tamanho diferente do problema. Para o Mandelbroat foram consideradas matrizes de: 32 x 32, 64 x 64, 128 x 128 e 256 x 256 elementos. Para o N corpos, foram considerados: 4096, 8192, 16384 e 32768 corpos. Cada experimento, foi executado sob 4 cenários de teste diferentes, que consideraram 2, 4, 8 e 16 threads utilizadas na resolução do problema. Cada cenário de teste foi executado 5 vezes para que o tempo médio consumido na solução do problema pudesse ser calculado a partir das amostras. Desta maneira, a solução de cada benchmark foi computada 4 (plataformas de programação concorrente) x 4 (experimentos) x 4 (cenários de testes) x 5 (amostras) = 320 vezes. 2.4.1 O CONJUNTO DE MANDELBROAT Um fractal é um objeto geométrico que pode ser dividido em partes, cada uma destas semelhantes ao objeto original. O termo fractal foi criado em 1975 por Benoît 25 Mandelbrot, um matemático francês. Diz-se que os fractais têm infinitos detalhes, são geralmente auto-similares e independem de escala. Em muitos casos um fractal pode ser gerado por um padrão repetido, tipicamente um processo recorrente ou iterativo. O conjunto de Mandelbroat possui uma relação de recorrência para cada ponto de um plano complexo. 2.4.1.1 IMPLEMENTAÇÃO PARALELA A ideia mais intuitiva de paralelização do algoritmo de Mandelbroat é dividir a figura que se deseja calcular em sub-regiões que podem ser calculadas independentemente em diferentes threads. Figura 10. Divisão em segmentos do calculo do Fractal de Mandelbroat A Figura 10 ilustra o cálculo do Fractal de Mandelbroat com tamanho igual a 500 x 500. Supondo a utilização de uma máquina quadcore, o problema é dividido em quatro segmentos independentes. O segmento 1 é responsável pela faixa das linhas entre 0 - 124, o segmento 2 pelo calculo da faixa de linhas de 125 - 249, o segmento 3 pelo calculo da faixa de linhas entre 250 - 374 e, por fim, o segmento 4 é incumbido da faixa de linhas entre 375 - 499. Note que cada segmento trabalha com um subconjunto dos dados completamente independentes, dessa forma não é necessário a sincronização entre os processadores. A Figura 11 ilustra como o benchmark Mandelbroat pode ser paralelizado com a utilização do MOOM. ____________________________________________________________________________ function subRegMandelbroat(init,finish) for i = init, finish do ..COMPUTE VALUE OF FRACTAL MANDELBROAT POSITION i.. end end 26 --MOOM PARALLEL subRegMandelbroat(0,124) --MOOM PARALLEL subRegMandelbroat(125,249) --MOOM PARALLEL subRegMandelbroat(250,374) --MOOM PARALLEL subRegMandelbroat(375,499) --MOOM JOINALL ____________________________________________________________________________ Figura 11. Implementação paralela do Fractal de Mandelbroat(500 x 500) sobre o MOOM 2.4.1 O PROBLEMA DOS N CORPOS O problema dos N Corpos tem como principal objetivo prever o movimento de um grupo de objetos celestes que interagem gravitacionalmente uns com os outros. A resolução deste problema foi motivada pela necessidade de compreender o movimento do Sol, dos planetas e das estrelas. O problema foi proposto por Isaac Newton (Newton, 1687) e permanece sem solução até hoje. Newton resolveu o caso com dois corpos, mostrando que a proposta de Johannes Kepler sobre o movimento dos corpos celestes estava correta. 2.4.1.1 IMPLEMENTAÇÃO PARALELA Neste problema, cada corpo ou partícula presente no espaço possui sete propriedades, das quais seis (x, y, z, vx, vy, vz) devem ser constantemente atualizadas. Estas propriedades indicam a posição que cada corpo ocupa no espaço (x, y, z) e o vetor tridimensional que indica em qual direção o corpo se movimenta (vx, vy, vz). A paralelização do problema dos N corpos ocorre em duas etapas: A primeira etapa consiste em calcular o vetor de movimento de cada corpo (vx, vy, vz) considerando os demais corpos do espaço. Considerando um cenário onde temos uma máquina com dois núcleos de processamento e 512 corpos, cada núcleo fica responsável por atualizar o vetor de movimento de 256 corpos. Terminada a etapa de atualização dos vetores de movimento de todos os corpos, inicia-se a segunda etapa. Na segunda etapa, as posições (x, y, z) de todos os corpos devem ser atualizadas, considerando o vetor de movimento e uma constante d definida a priori pelo modelador. 27 A Figura 12 ilustra as chamadas para os métodos que atualizam os corpos. A função up_vector_dir implementa a atualização dos vetores de direção dos corpos no espaço. A chamada à função up_position é responsável por atualizar as posições dos corpos no espaço. Apenas duas varreduras na coleção de corpos são suficientes para resolver o problema. A cada varredura dos corpos, os cálculos de direção e posição, são atualizados concorrentemente. ____________________________________________________________________________ function advance(dt) --step 1 for idx = 1, nbody do --MOOM PARALLEL up_vector_dir(idx,dt) end --MOOM JOINALL --setp 2 for idx = 1, nbody do --MOOM PARALLEL up_position(idx,dt) end --MOOM JOINALL end ____________________________________________________________________________ Figura 12. Implementação paralela do problema dos N corpos sobre o middleware MOOM 2.5 Resultados alcançados A Figura 13 apresenta o desempenho de cada projeto na execução do benchmark de Mandelbroat. O desempenho no benchmark do problema dos N corpos é apresentado na figura 14. As figuras 15, 16 e 17 mostram os gráficos de speedup dos projetos Lanes, ALua e MOOM. A partir desses gráficos, é possível verificar a escalabilidade destes projetos na execução de várias instancias dos problemas de Mandelbroat e dos N corpos. O speedup foi calculado a partir da seguinte formula, , onde S é o speedup obtido para uma instância do teste considerando p cores de processamento. T1, representa o tempo do teste executando de forma sequencial e Tp, representa o teste executado em um ambiente onde foram disponibilizadas p threads. Quando o nível de concorrência é baixo, 2 threads o projeto Lanes apresentou excelente desempenho em ambos os benchmarks. Quando é necessário pouca sincronização entre processos, como no problema de Mandelbroat, ele tem boa escalabilidade. Porém, acima de 8 threads, a comunicação através do módulo Linda 28 passa a afetar o seu desempenho. No problema dos N corpos, que exige muita comunicação, este gargalo é evidente e compromete a escalabilidade do Lanes. Figura 13. Resultado dos experimentos com benchmark dos Fractais de Mandelbroat O tempo de resposta do projeto Luaproc para uma instancia pequena (32 x 32) do benchmark de Mandelbroat é muito maior que os demais projetos avaliados: 26 segundos em média. Por isto, o resultado não é mostrado no primeiro gráfico da figura 13. Quando o nível de concorrência cresce, acima de 2 threads, a escalabilidade da aplicação Luaproc é comprometida pelo uso de um único canal de comunicação para reunir no mestre os resultados dos escravos. Isto ocorre até mesmo em aplicações que exigem pouca sincronização, como o benchmark de Mandelbroat. A ocorrência de leaks de memória impediram a avaliação do Luaproc através do uso do problema dos N corpos. Contudo, a tendência é de que, neste problema, o gargalo introduzido pelo uso de um único canal de comunicação comprometa ainda mais a escalabilidade do Luaproc. 29 O projeto ALua apresentou bom desempenho e escalabilidade nos experimentos que puderam ser realizados. No entanto, o benchmark de Mandelbroat abortou sua execução para instancia de 256 x 256 elementos. Alem disto, o benchmark dos N corpos abortou sua execução em todos os cenários planejados, no momento em que os estados dos N corpos eram serializados e enviados para os processos escravos. A medida que a instancia dos problemas crescem este problema se agrava, comprometendo a escalabilidade da solução, porque os dados precisam ser continuamente enviados para processamento nos escravos e atualizados no mestre. Figura 14. Tempo médio de execução do benchmark N-Body nas plataformas MOOM e Lanes Quando o nível de concorrência é baixo, 2 threads, o desempenho middleware MOOM é equiparável ao desempenho das demais projetos de programação concorrente em Lua. Para níveis de concorrência maiores, o desempenho do MOOM foi superior em todos os casos. O MOOM apresenta excelente escalabilidade para qualquer dos benchmarks. Apenas para instancias pequenas dos problemas, 32 x 32 elementos no benchmark de Mandelbroat e 4096 corpos no benchmark dos N corpos, os gráficos de speedup mostram que a saturação do sistema foi atingida em 4 e 8 threads escravas 30 (workers), respectivamente. Isto é, acima destes limiares, a adição de novas threads escravas não implica em redução significativa do tempo de resposta consumido na resolução dos problemas. Para grandes instancias dos problemas, a curva de speedup é sublinear e, no pior caso, apresenta ganhos aproximados de 50% para cada thread escrava adicionada ao sistema. Figura 15. Escalabilidade da plataforma Lanes para os benchmarks Mandelbroat e N-Body Figura 16. Escalabilidade da plataforma ALua para o benchmark Mandelbroat 31 Figura 17. Escalabilidade da plataforma MOOM para os benchmarks Mandelbroat e N-Body 2.6 Considerações finais Este trabalho apresenta o projeto do middleware MOOM para programação concorrente na linguagem de programação Lua. A implementação deste projeto para arquiteturas multiprocessadas é discutida em detalhe e, por meio de experimentos controlados, é apresentada uma análise comparativa do seu desempenho e escalabilidade com os trabalhos correlatos encontrados na literatura. Os resultados alcançados demonstram que o uso combinado das técnicas de anotação e bag of task resultam em um ambiente de programação concorrente de alto desempenho que é, ao mesmo tempo, flexível e escalável. Devido ao uso de anotações, as regras utilizadas para o particionamento dos problemas e sincronização dos processos não se misturam as regras que pertencem ao domínio de problema abordado pelas aplicações. Desta maneira, busca-se garantir a suavização do esforço do usuário no ato de efetuar transição da programação sequencial para programação paralela, a boa legibilidade das aplicações concorrentes e sua fácil depuração. Ao ignorar as anotações que instrumentam uma aplicação concorrente, qualquer interpretador Lua pode executa-la de forma sequencial, sem qualquer influência dos mecanismos para controle de concorrência e sincronização. Tal flexibilidade facilita o desenvolvimento das aplicações concorrentes à medida que elas podem ser depuradas sequencialmente e o resultado das execuções concorrentes podem ser comparados ao resultado gerado pela execução sequencial. Segundo os experimentos realizados, quando apenas 2 processadores são utilizados, o desempenho do middleware MOOM é equivalente ao desempenho dos melhores trabalhos correlatos. No entanto, quando são utilizados mais processadores, o 32 desempenho do middleware MOOM é superior. As decisões de projeto pelo uso do modelo de comunicação por memória compartilhada e pelo uso do mecanismo de bag of task para escalonamento de tarefas resultaram em um middleware capaz de produzir aplicações de arquitetura mestre-escravo que são escaláveis, mesmo quando instancias pequenas de problemas são tratados. Apesar dos resultados alcançados serem relevantes, a abordagem avaliada apresenta algumas limitações. O particionamento das aplicações e sincronização das tarefas não é realizada de forma automatizada e tais decisões devem ser tomadas e implementadas pelo programador que, muitas vezes, pode não ser especialista em programação concorrente. O middleware MOOM foi projetado para uso em aplicações de arquitetura mestre-escravo, nas quais um volume massivo de dados precisa ser processado por diversos escravos e os resultados sumarizados por um processo mestre, como acontece em simulações científicas e em alguns jogos. Portanto, aplicações que possuam estas características podem apresentar desempenho e escalabilidade melhor se implementadas em outros middlewares. A abordagem proposta neste trabalho não foi avaliada sobre arquiteturas de hardware multicomputador. Nestes ambientes, os módulos físicos de memória estão distribuídos em diversos computadores. Por isto, a manutenção do modelo de comunicação por memória compartilhada pode gerar gargalos que não existiriam se o modelo de troca de mensagens fosse utilizado pelo MOOM. Como trabalhos futuros, julgamos relevante o desenvolvimento de soluções para arquiteturas com memória distribuída e utilizando GPU's. Com o desenvolvimento de tais versões, torna-se possível a concepção de uma solução híbrida que por sua vez viabilizará o uso eficiente dos recursos disponíveis em um cluster, de forma intuitiva e flexível para o usuário. 33 3 3.1 ESCALABILIDADE DAS PLATAFORMAS PARA MODELAGEM E SIMULAÇÃO AMBIENTAL SOBRE ARQUITETURAS DE HARDWARE MULTIPROCESSADAS Introdução A análise de simulações que reproduzam cenários das interações entre sociedade e natureza é essencial para avaliação de políticas públicas (Turner, 1995). Modelos ambientais de larga escala, nos quais extensas regiões geográficas são caracterizadas por dados espaciais em alta resolução tornam-se cada vez mais necessários e comuns. O volume massivo de dados que estes modelos precisam gerenciar e o enorme volume de cálculos que precisam ser computados de forma exaustiva acabam por desafiar a capacidade de processamento dos sistemas de computação atuais. Estes fatos justificaram o desenvolvimento plataformas de modelagem capazes de tirar proveito do poder agregado de arquiteturas de hardware nas quais diversos núcleos de processamento estão disponíveis (Cordasco, et al., 2012) (North, et al., 2011) (Richmond, et al., 2008). Contudo, estas plataformas oferecem suporte a um único paradigma de modelagem, o paradigma multiagente. Um paradigma de modelagem determina os conceitos que podem ser utilizados para representar o estado do modelo e a lógica utilizada para descrever as regras de simulação. Desta maneira, o crescente aumento de complexidade dos modelos ambientais também implica que o uso de apenas um paradigma de modelagem, dificilmente, será suficiente para modelar as mais variadas interações entre sociedade e natureza. Neste contexto, a plataforma de modelagem TerraME permite o uso simultâneo de múltiplos paradigmas na construção de um modelo. Entre eles, os paradigmas multiagentes, autômatos celulares, dinâmica de sistemas e especificação de eventos discretos (DEVS). Porém, TerraME não provê suporte para computação de alto desempenho (Carneiro, 2013). Geralmente, as equipes de modelagem são muitas vezes multidisciplinares e formadas por profissionais com conhecimento pouco aprofundado sobre computação de alto desempenho (biólogos, ecólogos, sociólogos, antropólogos, geógrafos, etc). Este fato torna necessário que as plataformas de modelagem sejam capazes de produzir, automaticamente, versões concorrentes e escaláveis dos modelos ambientais. É preciso alcançar ganhos de desempenho e, simultaneamente, reduzir a necessidade de acesso a 34 recursos compartilhados e os esforços de programação. Contudo, este não é um problema trivial. São duas as fontes primárias de desafios para a produção automatizada de versões concorrentes de modelos ambientais. A primeira é a natureza do fenômeno em estudo. Ela determina as dependências de controle e de dados entre as regras de simulação. Consequentemente, é necessário um conhecimento profundo do fenômeno para determinar como seu modelo pode ser particionado em pequenas tarefas que serão executadas de forma concorrente e, depois, combinadas durante a sincronização. A segunda fonte de problemas é a escolha de um paradigma de modelagem para a implementação do modelo. Cada paradigma pode exigir uma abordagem diferente para o particionamento do modelo e para sincronização de tarefas. No modelo baseados no paradigma de Autômatos Celulares (CA) (von Neumann, 1966), uma regra baseada em vizinhança podem exigir sincronização dos estados vizinhos para que a computação seja coerente. Nos modelos baseados no paradigma de Dinâmica de Sistemas (Von Bertalanffy, 1952), para evitar propagação de erros, a cada passo da simulação, todos os fluxos precisam ser computados antes da atualização do estoque em qualquer sistema. Nos modelos baseados no paradigma DEVS (Zeigler, 2005), uma ordenação global dos eventos é necessária para garantir que sejam executados na sequência correta por cada um dos processadores envolvidos na simulação. Nos modelos baseados no paradigma Multiagente (Wooldridge, 1995), a execução de um agente e de suas cópias em processadores remotos precisam ser coordenadas para resultar em computações coerentes. Estas questões tornam extramente difícil o particionamento automatizado de modelos baseados em múltiplos paradigmas. Além disto, a paralelização dos modelos, mesmo quando implementada por programadores profissionais, costuma resultar em modelos menos legíveis. O código fonte destes modelos mistura instruções para distribuição da carga de trabalho entre processadores com as regras de simulação, que pertencem ao domínio do fenômeno sendo modelado. Consequentemente, os modelos concorrentes tornam-se mais difíceis de serem entendidos e verificados por equipes multidisciplinares. Por isto, é essencial que as plataformas de modelagem sejam flexíveis o bastante para permitir que, a cada etapa do desenvolvimento de um modelo, as versões concorrentes sejam executadas de forma sequencial, sem qualquer interferência dos mecanismos para escalonamento, 35 comunicação e sincronização de processos. Desta maneira, os resultados produzidos pela execução sequencial poderão ser utilizados na verificação dos resultados produzidos pelas versões concorrentes. Na literatura, as pesquisas não abordam a paralelização ou a distribuição de modelos ambientais que fazem uso de múltiplos paradigmas. Merecem destaque as plataformas D-MASON (Cordasco, et al., 2012) e Repast HPC (North, et al., 2011) que oferecem serviços apenas para a distribuição de modelos multiagentes. Elas oferecem uma API (Application Programming Interface) na qual os modelos sequenciais devem ser reimplementados pelo modelador no intuito de produzir versões concorrentes. Desta maneira, as regras para simulação não podem ser executadas sem a influência dos mecanismos para o escalonamento, a comunicação e a sincronização dos processos. Diante deste cenário, este trabalho apresenta e avalia uma abordagem para o desenvolvimento e simulação de modelos ambientais concorrentes baseados em múltiplos paradigmas de modelagem. Esta abordagem tem como objetivo principal a capacidade de gerar simulações escaláveis e tem, como objetivo secundário, produzir modelos concorrentes flexíveis. A abordagem proposta consiste na tradução, automatizada do código anotado do modelo sequencial em um código paralelo passível de ser executado por uma máquina virtual, cujo modelo de concorrência e de balanceamento de carga independe dos paradigmas de modelagem ambiental empregados nos modelos. As anotações são comentários estruturados que são inseridos no código do modelo para alterar a maneira na qual as simulações são executadas. Para implementar a abordagem proposta, este trabalho estendeu o interpretador da plataforma de modelagem ambiental TerraME com os serviços para o desenvolvimento de modelos concorrentes em Lua. Lua é a linguagem de programação interpretada na qual os modelos TerraME devem ser codificados para posterior simulação. A plataforma de modelagem resultante passou a ser chamada TerraME HPA (High Performance Architecture). Ela utiliza o middleware de programação concorrente MOOM (Multithread Object Oriented Middleware) para executar, em paralelo, trechos de código Lua (Ierusalimschy, 2013) sobre arquiteturas de hardware de memória compartilhada. Assim como no MOOM, no TerraME HPA cada tarefa concorrente é representada por uma thread Lua, cuja execução se dá por meio do mecanismo de bagof-task (Ananth Grama, 2003). Neste mecanismo, as threads Lua são mantidas em uma 36 fila. Durante a simulação, um conjunto menor de threads do sistema operacional continuamente retira as threads Lua da fila e as executam até que a fila se esvazie. Esta estratégia reduz o nível de concorrência programado pelo modelador e promove a distribuição da carga de trabalho das simulações entre os processadores. O MOOM e o TerraME HPA oferecem um modelo de comunicação baseado no compartilhamento de variáveis em memória. O modelador pode definir seções críticas no código do modelo para controlar o acesso concorrente a estas variáveis. Ele também pode definir barreiras de sincronização entre as threads Lua de forma a coordena-las para a solução de um problema. Para avaliar o desempenho e a escalabilidade das plataforma de modelagem ambientais TerraME HPA, Repast HPC e D-MASON versões 1.5 e 2.1, foram realizados experimentos com versões concorrentes de dois modelos selecionados para funcionarem como benchmarks. O modelo boids (Craig, 1987) simula o voo de um bando de pássaros em um espaço limitado. Ele exige muita comunicação e sincronização entre as tarefas concorrentes executando a simulação. O modelo rumor (Grant, et al., 2000) simula a difusão de um boato em uma região do espaço. Ele exige pouca comunicação e sincronização. O D-MASON é a única plataforma a particionar o modelo de maneira transparente ao modelador, atribuindo a cada processador disponível a responsabilidade de simular um certa região do espaço e os agentes que ela habitam. Apesar disto, os experimentos como modelo boids evidenciaram a concentração de agentes em poucas regiões do espaço limitou severamente a escalabilidade da versão 1.5. O mecanismo para balanceamento de carga introduzido na versão 2.1 reduziu este problema. Porém, devido ao agravamento do desbalanceamento de carga de trabalho entre processadores, a escalabilidade das simulações diminui à medida que número de agentes concorrentes aumenta. A plataforma Repast HPC escalou melhor para instâncias menores do modelo rumor. Contudo, à medida que o número de agentes simulados aumentou sua escalabilidade também piorou. Por outro lado, os resultados demonstram que a plataforma TerraME HPA escalou muito bem na execução dos dois benchmarks. Quanto maior as instâncias dos problemas, maior foi o speedup alcançado. Este fato pode ser justificado devido ao maior custo da comunicação entre processos nas plataformas D-MASON e Repast HPC, na qual mensagens devem ser serializadas e transmitidas através das pilhas de protocolos de rede. No TerraME HPA, o custo de 37 serialização e transmissão de mensagens é evitado e o mecanismo de bag-of-tasks tende a equalizar a carga de trabalho das simulações entre os diversos processadores disponíveis. Além dos experimentos com benchmarks, o TerraME HPA foi bem avaliado em um estudo de caso real (Lanna, 2012), no qual o modelo TROLL (Chave, 1999) foi utilizado para simular o crescimento de uma floresta tropical sob cenários de mudanças globais. No TROLL, o espaço é representado em três dimensões e discretizado em voxels de 1 x 1 x 0,5 metros, fazendo com que 1 hectare de floresta ocupe cerca de 126 GBytes de memória. O speedup do modelo concorrente atingiu 35% de speedup linear quando 2 processadores foram utilizados para executar a simulação e 55% quando o 8 processadores foram utilizados. Através destes experimentos, também foi possível constatar que o uso de anotações conferiu flexibilidade aos modelos desenvolvidos em TerraME HPA. A qualquer momento durante o processo de modelagem, a corretude da implementação concorrente do modelo foi facilmente verificada sem qualquer influência dos mecanismos para execução paralela das simulações. Ao executar a implementação concorrente em uma versão sequencial do interpretador TerraME, as anotações introduzidas no código foram ignoradas, permitindo que os resultados gerados sequencialmente fossem comparados aos resultados gerados quando a mesma implementação foi executada, em paralelo, pelo TerraME HPA. O restante deste capítulo está estruturado como segue: A seção 3.2 discute como trabalhos relacionados encontrados na literatura lidam com o particionamento dos modelos e como acontece o escalonamento, a comunicação e a sincronização de tarefas concorrentes. As seções 3.3, 3.4 e 3.5 descrevem a metodologia utiliza na execução desta pesquisa. A seção 3.3 detalha a arquitetura da plataforma TerraME HPA. A seção 3.4 mostra exemplos de códigos de modelos concorrentes desenvolvidos em TerraME HPA. A seção 3.5 apresenta o plano de experimentos realizados para análise de desempenho e da escalabilidade das três plataformas de modelagem. Os resultados dos experimentos são apresentados e analisados na seção 3.6. Finalmente, as considerações finais e trabalhos futuros são apresentados na seção 3.7. 38 3.2 Trabalhos Relacionados Esta seção de texto discute as abordagens adotadas pelos principais trabalhos correlatos para o desenvolvimento de modelos ambientais concorrentes. D-MASON (Cordasco, et al., 2012) e Repast HPC (North, et al., 2011) oferecem diferentes interfaces de programação (API) para o desenvolvimento destes modelos concorrentes. Todas baseiam-se unicamente no paradigma multiagente. As APIs determinam como um modelo pode ser particionado em tarefas concorrentes menores e como elas podem se comunicar. A arquitetura de software dos simuladores implementados nestas plataformas definem como estas tarefas são escalonadas, executada e, então, sincronizadas durante uma simulação. Mantida pelo Laboratório Nacional Argonne, nos Estados Unidos da América, e agora gerenciado pela Repast Organisation, o Repast é uma plataforma de código livre para o desenvolvimento de simulações geoespaciais (North, et al., 2005) (Crooks, 2006). O Repast oferece uma série de templates que podem ser especializados para o desenvolvimento dos modelos ambientais. Estes templates representam o ambiente em que os agentes estão inseridos, a grade de células que mapeia as propriedades locais do espaço, os próprios agentes e a rede de conexões entre estes agentes. Atualmente, o Repast é implementado em três linguagens: Java (RepastJ e RepastS), Microsoft.NET (Repast.NET) e Python (RepastPy). O RepastS provê uma interface gráfica point-andclick para desenvolvimento interativo de certos componentes do modelo. A versão Repast HPC (Repast for High Performance Computing) estende a o Repast Symphony com serviços para o desenvolvimento de simulações escaláveis sobre arquiteturas de hadrware multicomputador. Desenvolvida pelo Laboratório de Computação Evolucionária da Universidade de George Mason em conjunto com o GMU Center for Social Complexity, a plataforma. MASON permite o desenvolvimento de modelos concorrentes em Java. O simulador DISTRIBUTED MASON ou D-MASON (Cordasco, et al., 2012) estende a plataforma MASON adicionando serviços para a distribuição de simulações sobre arquiteturas de hardware multicomputador. A programação multithreading para arquiteturas de hardware multiprocessador é nativa ao MASON. 3.2.1.1 PARTICIONAMENTO DO PROBLEMA 39 Nos modelos de larga escala, é comum que diferentes regiões do espaço geográfico sejam simuladas por processadores distintos, que são responsáveis por gerenciar os dados que caracterizam uma região e por simular as entidades que a habitam. As plataformas baseadas no paradigma multiagente, geralmente, realizam os ciclos de simulação em três estágios. No primeiro, toda a comunicação entre os agente é realizada. Depois, cada processador simula os agentes em sua região de maneira independente. Finalmente, o estado global da simulação é obtido pela sincronização de das regiões (partições) vizinhas. Esta estratégia garante a coerência nas computações, evita que o modelador tenha de decidir sobre a distribuição da carga de trabalho e a sincronização entre processos. Porém, pode não ser a abordagem mais eficiente quando diferentes sistemas precisam ser simulados em periodicidade diferentes, pois as sincronizações deverão ocorrer de acordo com o evento mais frequente. Simulações de fenômenos contínuos podem se tornar muito ineficientes neste cenário. Além disto, a concentração de agentes em uma determinada região pode levar ao desbalanceamento da carga de trabalho entre os diversos processadores. O D-MASON faz o particionamento da simulação de forma automatizada, impondo a arquitetura descrita acima como o padrão de todas as simulações desenvolvidas pelo seu uso. Por outro lado, o Repast HPC pode ser utilizado para implementar outras formas de particionamento do problema. Porém, o modelador deve projetar e implementar sua solução. 3.2.1.2 ESCALONAMENTO O escalonamento acontece de forma muito similar no Repast HPC e no DMASON (North, et al., 2011) (Luke, 2011). O escalonamento de eventos discretos acontece de forma distribuída e fortemente sincronizada (Fujimoto, 1990). A simulação possui uma arquitetura mestre-escravo. Os processos mestre e escravo possuem um único escalonador de evento discreto. Este escalonador mantém os eventos em uma fila ordenada por dois de seus atributos: Primeiro, pelo instante em que o evento deve ocorrer e, depois, por sua prioridade. Um evento define um instante, durante a simulação, em que o simulador deve executar uma determinada ação (conjunto de regras) para simular uma parte do modelo. É responsabilidade do modelador associar eventos a ações. Um evento é caracterizado por três atributos: O instante exato em que deve ser processado, sua periodicidade e sua prioridade. Para que os eventos sejam executados cronologicamente, após instanciar o modelo, o processo mestre passa a 40 coordenar os vários escalonadores de eventos locais. Ele executa ciclos de simulação até que um evento de parada seja executado. A cada ciclo, o próximo evento a ser executado é selecionado entre os primeiros eventos das filas dos escalonadores locais. Então, este evento é executado e o relógio interno de todos os escalonadores é adiantado para o instante em que ele ocorreu. Nas ações disparadas pelos eventos, a plataforma Repast-HPC permite que o modelador especifique funções que serão executadas em paralelo (MethodFunctor). Agentes podem ser executados a partir destas funções ou podem disparar várias delas. O fluxo principal de cada processo (mestre ou escravo) simula os agentes sem o uso de concorrência. O modelador é responsável pela programação multithread (em C++) se desejar que os agentes sejam simulados concorrentemente. Por sua vez, a plataforma DMASON escalona eventos que disparam conjuntos de objetos escalonáveis (stepable) que são executados, em paralelo. O modelador pode definir o número de threads de S.O. que serão utilizadas para escalonar esses objetos. Como um agente é um objeto escalonável, uma thread de S.O. pode simular vários agentes. 41 3.2.1.3 COMUNICAÇÃO A comunicação lógica entre agente acontece por troca de mensagem em ambas plataforma. No entanto, no Repast HPC, as funções paralelas alteram objetos globais e compartilhados. Por exemplo, o objeto shared grid implementa uma grade global de células discretas para representar o espaço geográfico compartilhado pelos diversos processos. Outros objetos compartilhados são: shared continuous space, shared scheduler, shared projections e shared network. O controle de acesso concorrente aos objetos compartilhados é realizado automaticamente. No D-MASON, não existem objetos compartilhados. No Repast HPC, os agentes podem se comunicar diretamente, requisitando cópias uns dos outros, ou via conexões pelas quais trafegam mensagens Message Passing Interface (MPI). As conexões entre processos precisam ser explicitamente construídas pelo modelador. Geralmente, ele constrói uma rede de conexões considerando relações espaciais (grid) ou sociais (context), como: proximidade, adjacência, amizade, descendência, filiação a grupos sociais, etc. (a) (b) Figura 18. Comunicação entre os agentes remotos A1 e B2: (a) Antes da comunicação e (b) durante e após a comunicação. Para que agentes remotos possam se comunicar, o modelador deve implementar rotinas para a serialização e deserialização do estado interno destes agentes. Desta maneira, o estado dos agentes pode ser automaticamente empacotado em mensagens MPI. A figura 18 mostra como a comunicação entre dois agentes remotos acontece. Os agentes A1 e B2 localizados, respectivamente, nos processos P1 e o P2 têm seus estados copiados de um processo para o outro. Durante a sincronização da simulação, toda atualização realizada sobre as cópias é consistida. 42 No D-MASON, somente agentes em regiões vizinhas podem se comunicar. Os processos (mestre ou escravo) se comunicam através de um mecanismo baseado no pattern PUBLISH-SUBSCRIBE. Cada processo responsável por simular uma região mantém um canal multicast no qual processos servindo outras regiões podem se subscrever. Para reduzir o custo de comunicação, o modelador deve definir a área de interesse de um agente. Uma área de interesse é uma região do espaço, centrada na localização do agente e que se estende por um raio definido pelo modelador. Somente agentes cujas área de interesse se sobrepõem serão informados sobre mudanças em seus estados internos. Para isto, os processos se subescrevem no canal multicast das regiões em que, os agentes locais e agentes remotos possuem áreas de interesse sobrepostas. A versão atual do D-MASON utiliza o middleware Java Message Services (JMS) para a comunicação entre processos. O servidor de filas Apache ActiveMQ é utilizado para gerenciar os canais e para rotear mensagens entre as regiões. Desta maneira, a comunicação entre agentes não exige a cópia de agentes remotos. A cópia de agentes só é realizada quando eles migram entre as regiões e, para isto, o modelador precisa fornecer rotinas para serialização e deserialização dos agentes. 3.2.1.4 SINCRONIZAÇÃO D-MASON e Repast HPC sincronizam os processos por meio de barreiras de sincronização. Porém, no Repast HPC, a sincronização se dá entre funções paralelas (MethodFucntor) e, no D-MASON, entre agentes (stepable objects). Enquanto a plataforma Repast HPC adota um esquema de sincronização gobal e definida explicitamente pelo modelador que, deve invocar o método mpi_all_reduce, a plataforma D-MASON sincroniza os processos de forma local e automática. No Repast HPC, durante cada passo de simulação, a chamada mpi_all_reduce faz com que o processo que a invocou aguarde até que todas as funções paralelas terminem sua execução. Então, os relógios internos dos escalonadores de evento discretos são sincronizados. No D-MASON, a sincronização acontece automaticamente entre regiões adjacentes no espaço. O passo i da simulação inicia com a migração de agentes entre regiões e com a atualização das áreas de interesses dos agentes. Então, os agentes de cada região r, aguardam o termino do passo i-1 dos agentes vizinhos. Depois, o passo i de cada agente da região r é computado com base no estado interno desses agentes. Finalmente, os relógio dos escalonadores são sincronizados. 43 3.3 O TerraME HPA Atualmente, o TerraME (Carneiro, et al., 2013) e o JDEVs (Filippi, et al., 2004) são os principais simuladores que permitem modelagem multiparadigma. 3.3.1 A PLATAFORMA DE SIMULAÇÃO TERRAME O TerraME é uma plataforma para o desenvolvimento e simulação de modelos ambientais baseados em múltiplos paradigmas. No TerraME, um modelo ambiental é visto como um “mini mundo”, isto é, um mundo virtual que representa um cenário para uma dada região geográfica, onde agentes, autômatos e sistemas interagem e alteram seus estados afim de simular atores e processos de mudanças reais. O TerraME é desenvolvido pelo TerraLAB – Laboratório de Modelagem e Simulação de Sistemas Terrestres do Departamento de Ciência da Computação (DECOM) da Universidade Federal de Ouro Preto (UFOP) e tem como parceiro o Instituto Nacional de Pesquisas Espaciais (INPE). TerraME é distribuído livremente para as plataformas Linux (32 e 64 bits), Windows, e Mac. O TerraME foi escolhido para a execução deste trabalho porque: (1) Os modelos são descritos na linguagem de script Lua, que além de ser menos complexa que uma linguagem de programação de uso geral, como Java e C++, possui um interpretador que, fundamentalmente, é uma máquina virtual que executa, passo a passo o código do modelo. Esta máquina virtual pode ser facilmente estendida para a realização desta pesquisa. (2) O TerraME tem um boa integração com Sistemas de Informação Geográfica utilizados para manter dados espaciais sobre a área simulada. (3) A linguagem TerraME foi projetada para promover uma decomposição natural dos modelos em módulos independentes que podem ser distribuídos e simulados de forma autônoma. Estes módulos, representados pelo tipo Environment presentes na linguagem, capturam todos os aspectos espaciais (espaço celulares integrados a bancos de dados geográficos), temporais (escalonadores de eventos discretos) e comportamentais (regras que provocam mudanças) de um "mini mundo". Este fato aumenta a coesão dos Environments e reduz o acoplamento entre eles, privilegia a localidade das computações e diminuiu necessidade de comunicação entre módulos. Environments podem ser aninhados, hierarquicamente, permitindo que modelos multi-escala sejam criados para representar mundos complexos a partir da composição de mundos mais simples representados em escalas específicas. Os níveis mais altos da hierarquia oferecem 44 controle aos níveis nos mais baixos que, por sua vez, fazem surgir padrões emergentes nos níveis mais altos. 3.3.2 ARQUITETURA DE SOTWARE Figura 19. Arquitetura do plataforma TerraME HPA, adaptado de (Carneiro, 2013). Os componentes em vermelho foram desenvolvidos neste trabalho. A Figura 19 mostra como os componentes da plataforma TerraME HPA estendem a arquitetura do simulador TerraME (Carneiro et al., 2013). A arquitetura é organizada em camadas. As camadas inferiores fornecem funcionalidades sobre as quais as camadas superiores implementam seus serviços. No nível mais baixo, a biblioteca C++ TerraLib (Câmara, et al., 2008) é utilizada para acesso a dados espaciais e integração com SIGs. No segundo nível, o framework C++ provê classes, objetos e métodos para a modelagem multiparadigma, além de serviços para simulação sequencial dos modelos. O componente C++ MOOM foi desenvolvido neste trabalho e estende estes serviços de forma a permitir a simulação concorrente de funções Lua. O terceiro nível é uma interface entre os componentes C++ e a linguagem de programação Lua. Nesta interface, são registrados os tipos de dados e as funções para a representação e simulação concorrente de modelos. Nos próximos níveis, o interpretador TerraME HPA recebe o código fonte do modelo e executa, um a um, os comandos Lua que o formam. Para isto, ele utiliza os serviços do interpretador nativo da linguagem Lua. Acima deste nível, o preprocessador TerraME HPA, também desenvolvido neste trabalho, traduz o código anotado do modelo TerraME em um novo código concorrente que utiliza a API Lua do módulo MOOM. O último nível da arquitetura consiste nos modelos ambientais desenvolvidos pelos usuários. 45 3.3.2.1 MOOM: Um componente para execução concorrente de aplicações Lua O MOOM é uma biblioteca C++ para desenvolvimento de aplicações concorrentes em Lua. Ela possui estruturas de dados e funções que permitem a criação de thread lógicas, na linguagem Lua, que são executadas por um conjunto de threads físicas, gerenciadas pelo sistema operacional (SO). O MOOM mantém as threads lógicas, chamadas tasks, em uma fila chamada bag-of-taks. As threads físicas, chamadas workers, continuamente executam as tasks na ordem em que são enfileiradas. Caso não haja task a ser executada, as workers hibernam e são acordadas pela primeira task que surgir. Desta maneira, mesmo que o programador defina um número muito grande de tasks Lua, elas serão executadas por poucas workers no nível de SO. Este fato resulta na economia dos recursos de hardware e reduz o nível de concorrência da aplicação final. O número de workers instanciadas pelo MOOM é automaticamente reconhecido e igual ao número de processadores disponíveis. Atualmente, o MOOM não dispõe de uma implementação distribuída. O MOOM fornece um espaço de endereçamento global no qual variáveis podem ser compartilhadas entre as tasks. O controle de acesso às variáveis compartilhas é realizada por meio de seções críticas explicitamente definidas pelo programador. A sincronização entre as tasks ocorre em barreiras de sincronização que também são definidas pelo programador. O MOOM fornece as seguintes funções para o desenvolvimento de aplicações concorrentes em Lua: MOOM_PARALLEL( F(x) ): Cria uma therad Lua que executa de forma concorrente a função F(x) fornecida como parâmetro MOOM_JOIN( F(x) ): Deve ser utilizada para a sincronização de threads Lua. Permite à tarefa que a executou aguardar pelo término a função concorrente F(x), cujo nome é fornecido como parâmetro. MOOM_JOINALL( ): Cria uma barreira de sincronização, fazendo com que a tarefa que a executou aguarde pelo termino de todas as threads Lua. MOOM_ACQUIRE( criticalSecName ): Indica o início da seção crítica "criticalSecName", isto é, um trecho de código no qual a exclusão mútua entre threads Lua é garantida. 46 MOOM_RELEASE( criticalSecName ): Indica que o término da seção crítica "criticalSecName", liberando-a para execução por outras threads Lua. 3.3.2.2 Integração TerraME e MOOM Figura 20. A máquina virtual TerraHPA para simulação de modelos ambientais concorrentes. A Figura 20 mostra como se dá a geração de tasks a partir das simulações em TerraME. O TerraME mantém vários escalonadores de eventos discretos organizados cronologicamente em uma árvore binária armazenada na área de memória compartilhada pelas tasks. Durante a simulação, os escalonadores são executados em ordem. Isto é, o primeiro evento na fila do simulador mais a esquerda na árvore é sempre o próximo evento a ser executado. Para que isto seja verdade, antes do escalonador mais a esquerda ser executado, ele é retirado da árvore, seu primeiro evento é disparado e, então, o escalonador é inserido de volta na árvore. Desta maneira, mesmo que o evento disparado cause a inserção de novos eventos na árvore, ela permanecerá ordenada e o tempo de simulação avançará corretamente para o instante do evento executado (Carneiro et al., 2013). Assim como nos trabalho correlatos, um evento é caracterizado pelo instante que deve ocorrer, por sua periodicidade e por sua prioridade. O modelador deve associa-los à ações que executam certas regras do modelo. Quando 47 uma ação termina, ela deve retornar um valor lógico. Se este valor for verdadeiro, o evento é inserido de volta no escalonador. Caso contrário, o evento não irá mais ocorrer e a ação a ele associada não será simulada. As ações disparadas pelos eventos podem conter chamadas assíncronas de funções Lua que serão executadas em paralelo. Então, à medida que os eventos são escalonados, estas chamadas assíncronas criam tasks responsáveis por executar as funções paralelas. Assim que criadas, as tasks são enfileiradas na bag-of-tasks do MOOM e passam a aguardar sua execução por um worker. Durante sua execução, as funções paralelas escrevem os resultados de suas computações nas variáveis compartilhadas. Para recuperar estes valores de maneira coerente, o modelador deve definir barreiras de sincronização que aguardem pelo término das funções. Para garantir a exclusão mútua entre tasks durante o acesso a variáveis compartilhadas, ele também precisa definir seções críticas no código das funções paralelas. Esta abordagem deixa a cargo do modelador todas as decisões relativas ao particionamento do modelo em tarefas menores, ao controle de concorrência e à sincronização destas tarefas. Como estas questões estão intimamente ligadas à natureza do fenômeno sendo modelado, é conveniente que o modelador receba esta responsabilidade. Diferente dos workers do MOOM, além de manipular os tipos de dados nativos da linguagem Lua, os workers do TerraME HPA são capazes manipular coerentemente os tipos de dados do TerraME. 3.4 Exemplos de modelos concorrentes em TerraME HPA Nesta seção, um conjunto de exemplos ilustram o uso e funcionamento básico das anotações oferecidas pelo MOOM. O exemplo da figura 21 mostra como atualizar concorrentemente as células de um espaço celular. O objeto cs do tipo CellularSpace, é instanciado com 100 x 100 células. A função fillCell recebe como parâmetros a posição da célula que será atualizada e o valor que será atribuído ao atributo da célula. A função test_fillCellularSpace percorre o espaço celular cs e, para cada célula, executa uma chamada assíncrona da função fillCell que irá executar em paralelo, pois foi previamente instrumentada com a anotação MOOM PARALLEL. Antes de terminar, a função test_fillCellularSpace usa a anotação MOOM JOIN para criar uma barreira de sincronização e aguardar o término de todas as funções fillCell. _____________________________________________________ cs = CellularSpace{ 48 xdim = 100 } function fillCell(indx,val) cs.cells[indx].attribute = val end function test_fillCellularSpace() for i = 1, #cs.cells do --MOOM PARALLEL fillCell(i,0.5) end --MOOM JOIN fillCell end test_fillCellularSpace() _____________________________________________________ Figura 21. Atualização concorrente de um espaço celular. As anotações MOOM também podem ser utilizadas para executar concorrentemente diversos agentes ou autômatos. A figura 22 apresenta trechos do código de um modelo presa-predador espacialmente explícito e baseado no paradigma multiagente. Depois do espaço celular cs ser criado, a tabela predatorsTab é preenchida com 1000 predadores. A tabela preysTab é instanciada com 3000 presas. As presas e os predadores são caracterizados por atributos que armazenam seu tipo e sua energia. No TerraME, agentes e autômatos possuem um método excute() que deve ser implementado pelo modelador para simular seu comportamento. O escalonador (Timer) t possui dois eventos cujas periodicidades são 1 (padrão) e 5, respectivamente. A ação do primeiro evento executa as funções execPredatorAgent e execPreyAgent assincronamente e, em seguida, as sincroniza. Desta forma, todos os predadores e presas são simulados em paralelo. A ação do segundo evento grava o estado do espaço celular a cada 5 passos da simulação. ____________________________________________________________________ cs = CellularSpace{xdim = 100} predatorsTab = {} preysTab = {} for i = 1, 1000 do ag = Agent{ energy = 20, type = "predator", execute = function( self ) -- MOOM AQUIRE cs self.move() -- MOOM RELEASE cs -- MOOM JOIN ALL self.attack() end } cell = cs:sample() 49 ag:enter(cell) table.insert(predatorsTab, ag) end for i = 1, 3000 do ag = Agent{ energy = 20, type = "prey", execute = function( self ) -- MOOM AQUIRE cs self.move() -- MOOM RELEASE cs -- MOOM JOIN ALL self.dieOrLive() end } cell = cs:sample() ag:enter(cell) table.insert(preesTab, ag) end function execPredatorAgent(i,i1) for ind=i,i1 do predatores[i]:execute() end end function execPreyAgent(i,i1) for ind=i,i1 do preys[ind]:execute() end end t = Timer{ Event{ action = function() for i = 1, #predatorsTab,100 do --MOOM PARALLEL execPredatorAgent(i,i+100) end for i = 1, #preysTab,100 do --MOOM PARALLEL execPreyAgent(i,i+100) end -- MOOM JOINALL end }, Event{ period = 5, action = function() cs:save() end } } t:execute(10) ____________________________________________________________________ Figura 22. Execução modelo presa predador em TerraML. 3.5 Experimentos para análise de desempenho Esta seção de texto apresenta os experimentos realizados para avaliar o desempenho e a escalabilidade da abordagem proposta. Ela descreve os modelos executados nestes experimentos e o desenho experimental. A escolha dos modelos que 50 serviram como benchmarks para as plataforma de modelagem ambiental teve como critério a disponibilidade de versões oficiais destes modelo, isto é, desenvolvidas pelos autores das plataformas, e permitirem a análise de questões relativas ao balanceamento de carga e escalabilidade das simulações. Quando o espaço geográfico é representado de forma distribuída, os modelos boids (Craig, 1987) permitem relacionar a mobilidade dos agentes ao balanceamento de carga entre processadores. No modelo de rumor (Moreno, et al., 2004) os agentes têm localização fixa e comunicam-se apenas com seus vizinhos, portanto, a carga de trabalho é balanceada à priori no particionamento do problema. Assim, ele serve com um experimento de controle para os modelos de boids. Para avaliarmos o desempenho do TerraME HPA em estudos de casos reais (Lanna, 2012), onde instâncias massivas dos modelos são simuladas e analisadas em detalhe, foram realizados experimentos com o modelo TROLL (Chave, 1999). Este modelo simula o crescimento de uma floresta tropical controlado pela competição por luz entre as árvores que ocupam um espaço tridimensional. Algumas regras são baseadas em relações de vizinhança tridimensionais e, por isto, as funções paralelas precisam ser sincronizadas e se comunicar. O número de árvores varia conforme a floresta coloniza o espaço e amadurece. Cada árvore precisa de no mínimo 1 x 1 metros para sobreviver. 3.5.1 DESENHO EXPERIMENTAL Os experimentos com os modelos boid e rumor, utilizados para avaliar as plataformas D-MASON e Repast HPC, foram executados em uma máquina com Sistema Operacional Ubuntu 64-bits, com 128 GB RAM 1333 MHz e 2 processadores Intel Xeon com 12 núcleos de processamento reais e hiperthreading, emulando 24 núcleos virtuais de processamento. Para cada plataforma, o tempo de execução das simulações foi coletado em 5 cenários de teste. Para o Repast HPC foram utilizados os seguintes cenários: (a) Simulações sequenciais de cada modelo (todos os agentes simulados por apenas 1 processo), (b) Simulações que distribuídas em 3, 6, 12 e 24 processos. A carga de trabalho variou entre 2,5; 10; 20; e 40 milhões de agentes. Para o D-MASON, além do cenário com simulações sequenciais, considerou-se mais 4 cenários que utilizaram 4, 9, 16 e 25 processos, pois o D-MASON exige que o número processos executando a simulação seja quadrático. A carga de trabalho variou entre 1 5; 10; e 15 mil agentes. Todos os experimentos foram realizados 3 vezes e a média do tempo de execução calculado. Além disto, os experimentos foram realizados para duas 51 versões diferentes da plataforma D-MASON, as versões 1.5 e 2.1. Somente a versão 2.1 oferece serviços para o balanceamento de carga entre processadores. Desta maneira, foram realizados 240 experimentos nos quais o modelo foi simulado por 11000 iterações. Os experimentos com o modelo TROLL foram executados somente na plataforma TerraME HPA. Eles foram executados em uma máquina com Sistema Operacional Ubuntu 64-bits, com 8 GB RAM 1333 MHz e com 1 processador Intel Xeon contendo 8 núcleos de processamento. Cada experimento foi executado de 5 vezes, para simular 22,5 hectare de floresta representado por 500 x 500 x 50 voxels de 1 x 1 x 0.5 metros. O crescimento da floresta foi simulado por 2000 anos em cada experimento. Então, o consumo de memória e tempo de execução de cada experimento foram coletados e o speedup atingido foi calculado. Foram avaliados 4 cenários de teste: (a) Simulações sequenciais do TROLL, (b) Simulações com 2, 4 e 8 workers (threads de SO). No total, foram realizados 20 experimentos, nos quais o modelo foi simulado por 11 mil iterações. 3.5.2 O MODELO BOIDS Os boids (Craig, 1987) ou, bird-like objects, são modelos que simulam o voo conjunto de um bando de pássaros inseridos em um espaço limitado. Estes modelos exibem padrões espaciais que emergem da interação entre indivíduos autônomos. Apesar de não existir uma regra centralizada que coordena o voo dos pássaros, os pássaros não colidem e formam agrupamentos que voam em formação. Um pássaro virtual, ou boid, é descrito apenas por três regras que representam seu comportamento baseado na sua posição, velocidade e iteração com os demais boids. Estas regras são: (a) Separação - Os boids tentam evitar agrupamento local; (b) Alinhamento - Os boids se direcionam para o grupo de boids mais próximo; e (c) Coesão - Os boids se direcionam para a posição central de um agrupamento. Um boid tem acesso direto à representação de todo o cenário. Porém, os agrupamentos interagem apenas com uma pequena vizinhança. Cada boid possui uma vizinhança local (AOI - area of interest) caracterizada por uma distância a partir de seu centro e um ângulo. Na regra de alinhamento, os boids fora da AOI são ignorados. Existem diversos trabalhos na literatura que descrevem implementações concorrentes para modelos boids (Lorek, et al., 1993) (Bo Zhou, 2004). Neste trabalho, foram realizados experimentos comparativos entre duas implementações concorrentes. 52 Elas diferem do modelo originalmente descrito na literatura (Craig, 1987), pois consideram um número de fixo boids. Isto é, não há criação de novos boids, e nem remoção dos boids da simulação. Além disto, as implementações avaliadas particionam o modelo de maneira diferenciada. A implementação para D-MANSON foi obtida diretamente a partir da Internet, no sítio oficial dessa plataforma. Ela utiliza apenas uma abordagem distribuída, isto é, ela não usa multitherading. Ela particiona o problema dividindo o espaço em regiões de igual tamanho e as atribui a processos diferentes que, simulam os boids em seu interior. Os boids migram entre regiões e, quando isto acontece, os boids podem ser enviados de um processo para o outro. Assim, se ocorrer uma concentração de boids em uma única região, a carga de trabalho nos diversos processos pode se desbalancear. Devido as regras baseadas em vizinhança, os boids localizados nas bordas de uma região precisam obter informações sobre boids simulados por outro processo. Neste momento, os processos (regiões) vizinhos precisam se comunicar. O MOOM ainda não possui uma implementação distribuída. Portanto, a solução em TerraME HPA utiliza apenas mutithreading. Como o MOOM fornece um espaço de memória global e compartilhado, não faz sentido particionar o problema dividindo o espaço em regiões que são simuladas por tarefas concorrentes. Então, independente de sua posições no espaço, os boids são divididos em conjuntos de igual tamanho que, são simulados por diferentes funções Lua paralelas. 3.5.3 MODELO RUMOR O comportamento das respostas de uma população conectada, quando exposta por perturbações externas, é de grande interesse para os pesquisadores que trabalham com a análise de sistemas complexos. Neste contexto, o estudo da propagação de rumores é de grande interesse estratégico para os diversos níveis da sociedade (economia, política, defesa, moda e etc...) (Grant, et al., 2000) (kosfeld, 2005). Enquanto a avaliação sobre a autenticidade de um rumor compete à indivíduos autônomos, alguns padrões de comportamento podem emergir no nível social. Duas implementações destes modelos foram utilizadas para comparar o desempenho das plataformas Repast HPC e TerraME HPA. Nestas implementações, os agentes permanecem em uma posição fixa no espaço durante toda a simulação e interagem apenas com os agentes localizados em sua vizinhança. A probabilidade de 53 que um agente acreditar que um rumor é verdadeiro depende diretamente da quantidade de vizinhos propagando o mesmo rumor. Ambas as implementações particionam o problema atribuindo um número fixo e igual de agentes a uma tarefa concorrente. No entanto, a implementação para Repast HPC é distribuída, enquanto que, a implementação para TerraME HPA é multithreading. A implementação para Repast HPC foi obtida a partir da Internet, no site oficial desta plataforma. 3.5.4 O MODELO TROLL O TROLL simula uma floresta crescendo em três dimensões (Chave, 1999). Ele considera que no interior de uma floresta tropical, árvores individuais competem pela luz disponível e sombream umas as outras. O espaço que a floresta ocupa é representado por várias grades de voxels empilhadas verticalmente como camadas. A cada passo da simulação, o crescimento de uma árvore varia de acordo com fluxo de luz entrando em um voxel e a densidade foliar dessa árvore naquele voxel. No entanto, a intensidade do fluxo de luz entrando em um voxel depende da quantidade de luz absorvida nos voxels vizinhos (adjacentes) na camada superior da floresta. Como o crescimento da floresta depende de regras baseadas em relações de vizinhança, as coerências das computações exige que as funções paralelas executem de forma sincronizada e que controlem o acesso concorrentes aos valores armazenados nos voxels compartilhados em uma vizinhança. Na implementação deste trabalho, a simulação é realizada por camadas de cima para baixo. Isto é, ao se computar os campos de luz no interior da floresta, os voxels da camada superior são computados e sincronizados primeiro. Depois, a camada de voxesl imediatamente inferior é computada e sincronizada. A simulação prossegue até que a camada de voxels que toca o solo da floresta também seja computada e sincronizada. 3.6 Resultados Esta seção de texto descreve os resultados alcançado neste trabalho, organizando-os por modelo utilizado nos experimentos. 54 3.6.1 RESULTADOS PARA O MODELO TROLL Figura 23. TROLL simulation runtime A Figura 23 mostra a redução do tempo de execução do modelo TROLL à medida que o número de núcleos de processamento utilizados (uma worker por núcleo) na simulação aumenta de 1 para 8. O uso de 2 núcleos reduz o tempo de execução em aproximadamente 35%. Conforme a concorrência aumenta, os pontos de sincronização limita o speedup da simulação que aproxima-se de 55% para 8 núcleos. Elaborar melhores estratégia de particionamento do modelo TROLL é uma questão que está fora do escopo deste trabalho. 3.6.2 RESULTADOS PARA O MODELO BOIDS As figuras 24 e 25 mostram como o tempo de simulação do modelo boid varia à medida que o número de agentes aumenta. A implementação modelo exige muita comunicação e sincronização entre as tarefas concorrentes. Além disto, conforme o modelo boids originalmente implementado pelo time D-MASON, no início da simulação todos os agentes estão na mesma posição. O tempo de execução cresce exponencialmente com relação ao número de agentes, na plataforma D-MASON. O tempo de execução é pouco afetado pelo número de processadores executando a simulação, porque após 11 mil iterações do modelo, o desbalanceamento de carga ainda é grande. A maioria dos agentes permanece na região original que é simulada por um único processador. O mecanismo de balanceamento de carga introduzido na versão 2.1 faz com que ela tenha melhor desempenho que a versão 1.5. Infelizmente, a versão 1.5 falhou em várias tentativas de executa-lo com 9 55 processadores. Por isto, o gráfico deste experimento não é apresentado. Na plataforma TerraME HPA, o tempo de execução cresce linearmente com número de agentes simulados. O tempo de execução diminui à medida que aumenta o número de processadores executando a simulação. (a) (b) (c) (d) Figura 24. Tempo de execução modelo boids para as plataformas DMASON e versão 1.5 e 2.1 quando (a) 4, (b) 9, (c) 16 e (d) 25 processadores executam a simulação. (a) (b) 56 (d) (c) Figura 25. Tempo de execução modelo boids na plataforma TerraME HPA quando (a) 4, (b) 9, (c) 16 e (d) 25 processadores executam a simulação. (a) (b) (c) Figura 26. Escalabilidade das plataformas D-MASON versão (a) 1.5 e (b) 2.1; e (c) TerraME HPA ao executar o modelo boids. A figura 26 mostra a escalabilidade das plataforma TerraME HPA e DMASON,versões 1.5 e 2.1, ao executarem o modelo boids com 1 mil, 5 mil, 10 mil e 15 mil agentes. O speedup da simulação reduz à medida que a carga de trabalho aumenta, devido ao agravamento do desbalanceamento. Estes fatos limitam a escalabilidade da 57 simulação em D-MASON versão 1.5. O mecanismo para balanceamento de carga introduzido na versão 2.1 consegue amenizar significativamente o problema quando 10 mil agentes são simulados. Porém, a escalabilidade da simulação reduz conforme a carga de trabalho aumenta. Para 10 mil agentes, plataforma TerraME HPA escala somente até 9 processadores. Contudo, a escalabilidade da simulação aumenta conforme a carga de trabalho aumenta. Figura 27. Consumo de memória do modelo boids nas plataformas TerraME HPA e DMASON versões 1.5 e 2.1 A figura 27 como varia o consumo de memória do modelo rumor quando executado nas plataformas TerraME HPA e D-MASON versões 1.5 e 2.1. A memória consumida foi mensurada ao final dos experimentos, após as 11000 iterações. Nas três plataformas, o consumo cresce linearmente como número de agentes. Contudo, o consumo de memória muito inferior na plataforma TerraME HPA. A versão 2.1 da plataforma D-MASON demanda mais memória que a 1.5. 3.6.3 RESULTADOS PARA O MODELO RUMOR Na Figura 28 é possível observar a análise de desempenho para as plataformas TerraME HPA e Repast HPC. No primeiro cenário foram instanciados 2500000 agentes, e para este teste, é possível observar que para todas as configurações de número de threads utilizadas a solução utilizando TerraME HPA apresentou desempenho mais satisfatório que a solução utilizando Repast HPC. Para as diferentes configurações de números de threads o TerraME HPA apresentou um desempenho de até 5 vezes superior ao se comparar o desempenho apresentado pelo Repast HPC. 58 Com o objetivo de avaliar as plataformas de simulação ao executar o modelo de rumor, as seguintes configurações de número dos agentes foram utilizadas, 2500000, 10000000, 20000000 e 40000000. É possível observar que o desempenho da solução TerraME HPA apresenta um desempenho de aproximadamente 10 vezes superior ao demonstrado pela solução utilizando Repast HPC. A grande disparidade de desempenho demonstrado entre solução TerraME HPA e Repast HPC, ocorre pelo fato que enquanto o TerraME HPA é uma solução baseada em memória compartilhada, Repast HPC possui solução distribuída, ou seja para que haja a comunicação entre processos é necessário que pilhas de comunicação sejam utilizadas. A isto adiciona-se o fato que o Repast HPC, precisa efetuar cópias de agentes que estejam localizados em processos adjacentes, o que causa uma sobrecarga extra na comunicação entre processos. (a) (c) (b) (d) Figura 28. Tempo de execução do modelo rumor nas plataformas Repast HPC e TerraME HPA em diferentes cenários: (a) 3, (b) 6, (c) 12 e (d) 24 processadores executando a simulação. A figura 28 mostra como o tempo de execução do modelo rumor cresce à medida que o número de agentes simulados aumenta. Na plataforma Repast HPC, o crescimento do tempo de execução é rápido enquanto que, no TerraME HPA, o crescimento é muito 59 suave. Ambas as plataformas conseguiram simular até 40 milhões de agentes concorrentes. Para ambas, o tempo de execução diminui conforme o número de processadores executando na simulação aumenta. Porém, esta variação é mais significativa na plataforma Repast HPC, provavelmente, devido ao custo de comunição ser maior entre processos do que entre threads. (a) (b) Figura 29. Variação do speedup das plataforma Repast HPA (a) e TerraME HPA (b) conforme o número de agentes aumenta de 2,5 para 40 milhões. A figura 29 mostra como varia a escalabilidade das plataformas (a) Repast HPC e (b) TerraME HPA durante execução do modelo rumor conforme a carga de trabalho aumenta de 2,5 para 40 milhões de agentes. O Repast HPC escala melhor para menores quantidades de agentes. Conforme a carga de trabalho aumenta, sua escabalibilidade piora. Por outro lado, a escalabilidade da plataforma TerraME HPA aumenta conforme a carga de trabalho aumenta. Mesmo para 2,5 milhões, a simulação escala bem até 24 processadores sem se aproximar do ponto de saturação, a partir do qual não será viável adicionar mais recursos de hardware para obter melhor desempenho. Figura 30. Consumo de memória do modelo rumor nas plataformas TerraME HPA e Repast HPC 60 A figura 30 como varia o consumo de memória do modelo rumor quando executado nas plataformas Repast HPC e TerraME HPA. A memória consumida foi mensurada ao final dos experimentos, após as 11000 iterações. Nas duas plataformas, o consumo cresce linearmente com o número de agentes. Contudo, o consumo de memória é maior na plataforma Repast HPC. 3.7 Discussão dos resultados e trabalhos futuros Este estudo permitiu entender como varia o desempenho e a escalabilidade das plataformas TerraME HPA, Repast HPC e D-MASON versões 1.5 e 2.1 com diferentes cargas de trabalho. No entanto, não permite uma análise comparativa entre as plataformas porque D-MASON e Repast HPC foram avaliadas com modelos diferentes. Além disto, enquanto elas fornecem uma solução para arquiteturas de hardware de memória distribuída, o TerraME HPA fornece uma solução para arquiteturas de hardware de memória compartilhada. Atualmente, apenas a plataforma D-MASON fornece uma solução híbrida para o problema. No entanto, os autores consideram que esta é uma necessidade. Infelizmente, eles não encontraram modelos implementados pelas equipes D-MASON que explorassem simultaneamente multiprocessamento e multithreading. Os resultados dos experimentos realizados comprovam que a abordagem do TerraME HPA é promissora. Ela fornece o suporte necessário à modelagem multiparadigma de alto desempenho e escalou bem nos dois modelos utilizados como benchmarks, até mesmo para as menores instâncias do problema. No D-MASON, o mecanismo de balanceamento de carga introduzido na versão 2.1 diminuiu significativamente os problemas de escalabilidade da versão 1.5. Contudo, a concentração de agentes em uma poucas regiões continua a limitar escalabilidade das simulações. No Repast HPC, a escalabilidade das simulações é limitada pelo custo das comunicações entre processos, através dos protocolos de rede, e pela ausência processamento multithreading. A Tabela 2 apresenta uma análise comparativa entre as plataformas de alto desempenho dos projetos Repast, MASON e TerraME. As plataformas dividem os modelos em módulos concorrentes de diferentes granularidades, agentes ou funções. 61 Todas utilizam um conjunto de escalonadores de eventos sincronizados por um tick de relógio global. Todas realizam a comunicação lógica entre agentes por meio de troca de mensagens. No entanto, Repast e TerraME permitem que variáveis sejam compartilhadas. Apenas a plataforma MASON possui uma implementação híbrida, capaz de tirar proveito do paralelismo de hardware em plataformas multiprocessador e multicomputador. Repast e TerraME exigem que o modelador explicitamente sincronize os módulos concorrentes, por meio de barreiras globais. Apenas o MASON realiza a sincronização localmente e de forma transparente ao modelador. Repast não explora multithreading, enquanto que MASON e TerraME implementam o mecanismo de bagof-task para distribuir a carga de trabalho entre diversas threads. Apenas no TerraME os modelos são desenvolvidos em uma linguagem de script de alto nível, nas demais plataformas os modelos são escritos em Java e C++. Tabela 2. Tabela comparativa das plataforma de modelagem para alto desempenho MASON Repast TerraME HPA Multiagente Multiagente Múltiplos Paradigmas Paradigma de Modelagem Granularidade de Tarefas Escalonamento Chamada de função Agente (MethodFunctor) Função Lua Escalonador de Escalonador de Escalonador de eventos eventos discretos + eventos discretos + discretos + relógio de relógio de simulação relógio de simulação simulação global global global Troca de Mensagem + Comunicação Troca de Mensagem Arquitetura de Memória distribuída e Hardware compartilhada objetos Memória compartilhados Compartilhada Memória Memória distribuída Compartilhada sobreposição das áreas Global com barreiras Global com barreiras de interesse de agentes definidas pelo definidas pelo vizinhos modelador modelador Bag de tarefas Fluxo principal dos Única bag de tarefas customizadas e processos MPI de tamanho fixo e Local e baseado na Sincronização Balanceamento 62 alocadas executam automático executa dinamicamente sequencialmente as concorrentemente as executam os agentes chamadas de funções funções Lua escalonados de forma escalonadas escalonadas concorrente Verificação Sim, através de Flexivel Não Não anotações Uso Geral Uso Geral Script Linguagem de Modelagem No desenvolvimento dos modelos utilizados nos experimentos, verificou-se que a técnica de anotação confere flexibilidade aos modelos desenvolvidos em TerraME HPA. Ela permite que modeladores gradativamente implementem versões concorrentes dos modelos, com liberdade para definir a estratégia de particionamento do modelo e a granularidade do controle de acesso à variáveis compartilhadas. Ela também permite que o código concorrente seja verificado, corrigido e evoluído sequencialmente, sem qualquer influência de mecanismos para computação multitarefa ou multiprocesso, pois as regras do domínio de aplicação não são misturadas com chamadas à uma API de programação concorrente. Ao isolar as falhas ou melhorias do domínio de aplicação das questões relativas à programação concorrente, esta abordagem facilita o desenvolvimento de modelos ambientais que requerem alto desempenho. Tanto no MASON quanto na plataforma Repast HPC, o código dos modelos é misturado com chamadas a uma API para programação concorrente e, por isto, não podem ser executados sem a influência dos mecanismos para computação paralela ou distribuídos. Executar o código sem esta influência é diferente de executá-lo utilizando apenas uma única thread ou um único processo. Nestes últimos casos, os mecanismos para escalonamento, sincronização e comunicação estão em funcionamento e podem afetar a simulação, em especial, se contiverem falhas. O experimento com o modelo TROLL avaliou a abordagem proposta em um problema real, no qual diversas estratégias de particionamento foram implementadas. Apesar do desempenho dos modelos concorrentes depender intimamente da estratégia adotada e parecer conveniente que o modelador seja responsabilizado por esta decisão, a 63 falta de transparência no particionamento do modelo pode ser vista como uma limitação da abordagem utilizada no TerraME HPA. Somente a plataforma MASON realiza o particionamento do modelo de forma completamente transparente. Trabalhos futuros incluem o desenvolvimento de versões do MOOM e do TerraME HPA para arquiteturas de hadrware de memória distribuída, além de versões para arquiteturas baseadas em GPU (Graphical Processing Unit). Os trabalhos futuros também incluem novos experimentos de análise de desempenho para avaliar comparativamente as plataforma de modelagem ambiental de alto desempenho. 64 4 CONSIDERAÇÕES FINAIS Este trabalho propõe e avalia uma abordagem para o desenvolvimento de modelos ambientais de alto desempenho, em especial, modelos que se valem de múltiplos paradigmas de modelagem e cujas simulações precisam processar concorrentemente uma quantidade massiva de dados armazenados em uma área de memória compartilhada por diversos processadores. Esta abordagem tem como meta a escalabilidade das simulações e a flexibilidade dos modelos, permitindo ao modelador melhorar o desempenho das simulações pela simples adição de novos processadores à infraestrutura de hardware e, a qualquer momento durante o processo de modelagem, verificar sequencialmente os modelos concorrentes sem a influência do código para paralelização ou distribuição da carga de trabalho. Para isto, ela utiliza duas técnicas bem conhecidas, mas pouco exploradas por plataformas da modelagem ambiental. A técnica de bag-of-tasks é utilizada para distribuir a carga de trabalho das simulações entre processadores, promovendo a escalabilidade das simulações. A técnica de anotação é utilizada para instrumentação do código sequencial do modelo, resultando em um código concorrente flexível. Neste trabalho, o middleware MOOM para programação concorrente na linguagem Lua foi desenvolvido e integrado à plataforma de modelagem ambiental TerraME, dando origem à plataforma de modelagem de alto desempenho TerraME HPA (High Performance Architecture). Tanto o MOOM quanto o TerraME HPA foram avaliados em experimentos para análise de desempenho. Estes experimentos demonstraram que a combinação das técnicas de anotação e bag-of-tasks resultou em um ambiente de modelagem flexível e, ao mesmo tempo, escalável. Um ambiente capaz de suavizar o esforço do modelador em fazer a transição da modelo sequencial para o modelo concorrente, permitindo que ele defina a forma de particionamento do modelo e que ele determine a granularidade do controle de acesso a variáveis compartilhadas. Ambos os componentes de software demonstraram-se promissores quando aplicados a estudos de casos reais e quando comparados aos trabalhos correlatos encontrados na literatura. Entre os trabalhos futuros desta pesquisa estão a implementação de versões distribuídas e híbridas destes componentes de software e a posterior avaliação destas versões em novos experimentos para análise de desempenho. 65 5 REFERÊNCIAS Aguiar Ana Paula Modeling Land Use Change in the Brazilian Amazon: Exploring Intra-regional Heterogeneity // PhD thesis. In: Remote Sensing Program. - INPE, Sao Jose dos Campos : [s.n.], 2006. Alioth Benchmarks Game [Online] // The Computer Language Benchmarks Game. - 15 de Outubro de 2013. 15 de Outubro de 2013. http://benchmarksgame.alioth.debian.org/. Ananth Grama e. Introduction to Parallel Computing [Seção do Livro] // Introduction to Parallel Computing. - [s.l.] : Massachusetts USA, 2003. Andrews G. R. and Schneider, F. B. Concepts and Notations for Concurrent Programming [Periódico] // ACM Comput. Surv.. - 1983. - pp. 3-43. Batty M. A generic framework for computational spatial modelling [Seção do Livro] // Agent-based Models of Geographical Systems / A. do livro Heppenstall A., Crooks, A., See, L., Batty, M.. - Dordrecht, NL : Springer, 2012. Benoit Kauppi Asko and Germain Lua Lanes [Online] // Lua Lanes - multithreading in Lua. - 13 de February de 2007 - 2013. - http://cmr.github.io/lanes/. Biberstein al, et. Instrumenting annotated programs [Conferência] // Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments. Chicago, IL, USA : ACM, 2005. Bo Zhou Suiping Zhou Parallel Simulation of Group Behaviors [Conferência] // Proceedings of the 2004 Winter Simulation COnference. - Singapore : [s.n.], 2004. Broutin E., et.al. Modelling Wireless Networks with the DEVS and Cell-DEVS formalisms [Periódico] // Proceedings of the Winter Simulation Conference (WSC). 2013. Câmara G e et.al TerraLib: An Open Source GIS Library for Large-Scale Environmental and Socio-Economic Applications [Conferência]. - [s.l.] : Open Source Approaches in Spatial Data Handling, 2008. Carneiro T. G. S.,et.al. An extensible toolbox for modeling natureesociety interactions [Periódico] // Environmental Modelling & Software. - 2013. - pp. 104 - 117. Chatzimparmpas L. ConcurrentLua [Online]. - 2007. - December de 2013. http://luaforge.net/projects/concurrentlua/. Chave J. Study of structural, sucessional and spatial patterns in tropical rain forest using troll, a spatially explicit forest model [Periódico] // Ecological Modeling,. - 1999. Cirne W, et.al Running bag-of-tasks applications on computational grids: The mygrid approach [Conferência] // International Conference on Parallel Processing. - 2003. - p. 407. 66 Cordasco G e et.al A Framework for distributing Agent-based simulations [Conferência] // EURO PAR 2011: PARALLEL PROCESSING WORKSHOPS, Lecture Notes in Computer Science. - 2012. - pp. 460 - 470. Costanza R.,Voinov,A. Landscape Simulation Modeling: A Spatially Explicit [Periódico] // Dynamic Approach, Series: Modeling Dynamic Systems. - 2004. Couclelis H. From cellular automata to urban models: New principles for model development and implementation [Seção do Livro] // Environment and Planning BEnvironment and Planning BPlanning. - 1997. Craig R. Flocks, herds and schools: A distributed behavioral model [Conferência] // Proceedings of the 14th annual conference on Computer graphics and interactive techniques. - [s.l.] : ACM, 1987. - pp. 24 - 34. Crooks C. J. E., et.al Principles and Concepts of Agent-Based Modelling for Developing Geospatial Simulations [Conferência] // Centre for Advanced Spatial Analysis (University College London). - London, UK : [s.n.], 2006. - p. 110. Deadman P., Robinson, D., et al. Colonist household decisionmaking and landuse change in the Amazon Rainforest: an agent-based simulation." [Periódico] // Environment and Planning B-Planning & Design. - 2004. - pp. 693-709. Eberlein R.L., Peterson, D.W. Understanding models with Vensim (TM) [Periódico] // European Journal of Operation Research. - 1992. - pp. 216-219. Filippi J e Bisgambiglia P JDEVS: an implementation of a DEVS based formal framework for environmental modelling [Periódico] // Environmental Modelling and Software. - 2004. - pp. 261 - 274. Fujimoto R. M. Parallel discrete event simulation [Conferência] // Commun ACM. 1990. - pp. 30 - 53. Grama A., et.al. Introduction to Parallel Computing [Seção do Livro] // Introduction to Parallel Computing / A. do livro Ananth Grama e.. - [s.l.] : Massachusetts USA, 2003. Grant M e Suchitra M Rumour and gossip in organisations: a conceptual study [Conferência] // Management Decision. - 2000. - pp. 339 - 346. Guisasola Ierusalimschy, R. and Tomás Rings [Online] // Rings - Multiple Lua States. - 11 de Junly de 2007. - http://keplerproject.github.io/rings/. Ierusalimschy R. Programming in Lua [Livro]. - 2013. Iosup Alexandru and Sonmez, Ozan and Anoep, et.al. The performance of bags-oftasks in large-scale distributed systems. [Conferência] // Proceedings of the 17th international symposium on High performance distributed computing, HPDC. - Boston, MA, USA : [s.n.], 2008. 67 Jobbágy E., Paruelo, J., Fernández, R., Oesterheld, M., Coutinho, H., Meirelles, M., Altesor, A, Panario, D., Piñeiro, D., Coronel, G., Di Bella, C., Viglizzo, E., Schlichter, T., Maceira, J., Podestá, G., Hoffmann, W., Jackson, R., Epstein, H. Land use change in the Rio de la Plata Basin: Linking biophysical and human factors to understand trends, assess impacts, and support viable strategies for the future [Relatório]. - [s.l.] : Inter-American Institute for Global Change Research (IAI), 2005. Karssenberg D e et.al The PCRaster software and course materials for teaching numerical modelling in the environmental [Conferência] // Transactions in GIS. 2001. - pp. 99 - 110. Kauppi A Lua Lanes - multithreading in Lua [Online] // Lua Lanes. - 9 de January de 2007. - http://kotisivu.dnainternet.net/askok/bin/lanes/. kosfeld Michael rumors and markets [Periódico] // journal of mathematical economics. - 2005. - p. 41. Lanna J M Efeitos da Dinâmica Sucessional de Florestas Neotropicais Pluviais Sobre sua Estrutura, Composição e Biomassa no Contexto das Mudanças Globais // Efeitos da Dinâmica Sucessional de Florestas Neotropicais Pluviais Sobre sua Estrutura, Composição e Biomassa no Contexto das Mudanças Globais. - Universidade Federal de Ouro Preto : PPEBT - Programa de Pós Graduação em Ecologia de Biomas Tropicais, 2012. Lisa Alexande, et.al. Future Global and Regional Climate Change [Relatório] : Stockholm, Sweden. - [s.l.] : Intergovernmental Panel on Climate Change, 2013. Löhr K. Concurrency Annotations Communications of the ACM. - 1993. for Reusable Software [Periódico] // Lorek Helmut e White Matthew Parallel Bird Flocking Simulation [Conferência] // Parallel Processing for Graphics and Scientific Visualization. - [s.l.] : CiteSeer, 1993. Luke S e et.al MASON: A New Multi-Agent Simulation Toolkit [Periódico] // Simulation. - 2005. - pp. 517-527. Luke S Multiagent Simulation And the MASON Library [Livro]. - George Mason University : [s.n.], 2011. Meadows H D Thinking in Systems: A Primer [Seção do Livro] // Thinking in Systems: A Primer. - [s.l.] : Education & Reference, 2008. - 1603580557. Michelson G. Mouly S. Rumour and gossip in organisations: a conceptual study [Conferência] // Management Decision. - 2000. - pp. 339 - 346. Moreno Y. e et.al. Dynamics of Rumor Spreading in Complex Networks [Artigo] // Physical Review. - [s.l.] : American Physical Society, 2004. 68 Moura A L. e Ierusalimschy R Revisiting coroutines [Periódico] // ACM Transactions on Programming Languages and Systems. - 2009. - pp. 6:1--6:31. Moura A. L., et.al. Coroutines in Lua [Periódico] // Journal of Universal Computer Science. - 2010. Newton Sir Isaac Philosophiæ Naturalis Principia Mathematica [Livro]. - 1687. North M J e Collier N Repast HPC: A platform for Large-Scale Agent-Based Modeling [Periódico] // Computing Techniques for Complex System Simulation. 2011. North M J e et.al The Repast Simphony Development Environment [Conferência] // Proceedings of the Agent 2005 Conference on Generative Social Processes, Models, and Mechanisms. - Argonne National Laboratory and The University of : ANL/DIS, 2005. - pp. 13 - 15. North M J. e et.al Experiences creating three implementations of the repast agent modeling toolkit [Conferência] // CM Transactions on Modeling and Computer Simulation. - [s.l.] : ACM, 2006. - pp. 1 - 25. Organization World Health Carta de Ottawa. Primeira Conferência Internacional sobre Promoção da Saúde [Relatório]. - Ottawa : [s.n.], 1986. Pall M Benchmark Game - Mandelbroat [Online] // The Computer Language Benchmarks Game Mandelbroat. 2011. http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=mandelbrot&lang=l ua. Pall Mike Benchmark Game - Mandelbroat [Online] // The Computer Language Benchmarks Game Mandelbroat. 2011. http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=mandelbrot&lang=l ua. Richmond P e Romano D Agent Based GPU, a Real-time 3D Simulation and Interactive Visualisation Framework for Massive Agent Based Modelling on the GPU [Conferência] // Proceedings of International Workshop on Supervisualisation. - Island, Greece : [s.n.], 2008. Roberts N., Anderson, D., Deal, R., Garet, M., Shaffer, W. Introduction to Computer Simulation: a System Dynamics Modeling Approach [Relatório]. - Reading, MA : Addison-Wesley, 1983. Rodriguez Cristina Ururahy and Noemi ALua: An Event-Driven Communication Mechanism for Parallel and Distributed Programming [Conferência] // In Proceedings of ISCA 12th International Conference on Parallel and Distributed Computing Systems. - Fort Lauderdale, USA : [s.n.], 1999. - pp. 108 - 113. 69 Salazar L F e et.al Climate change consequences on the biome distribution in tropical south america [Periódico] // Geophysical Research Letters. - 2007. Skyrme A Um modelo alternativo para programação concorrente em Lua [Conferência] // Master’s thesis, Pontifícia Universidade Católica do Rio de Janeiro. Rio de Janeiro : [s.n.], 2007. Skyrme A, Rodriguez N e Ierusalimschy R Exploring Lua for Concurrent Programming [Conferência] // XII Brazilian Symposium on Programming Languages. 2008. Soares B. S., Assuncao, R. M., et al. Modeling the spatial transition probabilities of landscape dynamics in an amazonian colonization frontier [Periódico] // Bioscience. 2001. - pp. 1059-1067. Tisue S., Wilensky, U. NetLogo: a Simple Environment for Modeling Complexity [Conferência] // International Conference on Complex System. - Boston : [s.n.], 2004. Tomlin C.D. Geographic Information Systems [Conferência]. - Englewood Cliffs, NJ : [s.n.], 1990. and Cartographic Modeling Turner B., Skole, D., Sanderson, S., Fischer, G., Fresco, L., Leemans, R Land-use and Land-cover Change (LUCC): Science/Research Plan [Relatório] : HDP Report No. 7. - Stockholm. : IGBP Secretariat, 1995. Ururahy C e Rodriguez N ALua: An event-driven communication mechanism for parallel and distributed programming [Conferência] // In Parallel and Distributed Computing and Systems. - Fort Lauderdale, Florida : [s.n.], 1999. Ururahy C e Rodriguez N Programming and coordinating grid environments and applications [Conferência] // Concurrency and Computation: Practice and Experience. 2004. Ururahy C, Rodriguez N e Ierusalimschy R ALua: Flexibility for Parallel Programming [Periódico] // Computer Languages, Elsevier Science. - 2002. - pp. 155 180. Vitousek P M, Mooney H A e Lubchenco J and Melillo J M Human domination of Earth's ecosystems. Science [Relatório]. - 1997. - pp. 494-499. - 277. Von Bertalanffy L. Problems Of Life [Livro]. - New York : Harper and Brothers, 1952. Von Neumann J. Theory of Self-reproducing Automata [Seção do Livro] // Theory of Self-reproducing Automata. - Illinois : In: Burks, A.W. (Ed.), 1966. Wainer A G Applying Cell-DEVS Methodology for Modeling the Environment [Periódico] // SIMULATION: Transaction of the Society for Modeling and Simulation International. - 2006. - pp. 635-660. 70 Wooldridge M. J., Jennings, N. R. Intelligent agents: theory and practice [Conferência] // Knowledge Engineering Review. - 1995. World of Warcraft Lua - WoWWiki - Your guide to the World of Warcraft [Online] // Lua - WoWWiki - Your guide to the World of Warcraft. - 15 de November de 2008. 29 de Outubro de 2013. - http://www.wowwiki.com/Lua. Zeigle B P, Kim, T G, Praehofer, H Theory of Modeling and Simulation [Conferência] // Theory of Modeling and Simulation. - Orlando, FL, USA : [s.n.], 2005. 71