Algoritmos de Escalonamento Grupo 9 Luiz Otávio Duarte Marcelo Carvalho Sacchetin Orientação: Prof. Dr. Norian Marranghello Sumário 1. Algoritmo Genético 1.1. Escalonamento de tarefas de Multiprocessadores usand Algoritmo Genético 1.1.1. Resumo 1.1.2. Introdução 1.1.3 Escalonamento de multiprocessador 1.2. Escalonamneto para sisstemas de processadores paralelos 1.2.1. Resumo 1.2.2.Introdução 1.3. Algoritmos Genéticos 1.3.1. Resumo 1.3.2. Introdução 1.3.3. O Algoritmo: 1.3.4. Cruzamento (ou crossover) 1.3.5. Mutação 1.3.6. Como algoritmos genéticos s diferenciam de outras técnicas de procura 2. Algoritmo de Busca Tabu 2.1. Uma breve introdução 2.2. O uso da memória. 2.2.1. Dimensão de Qualidade 2.2.2. Dimensão de Influência 2.2.3. Dimensão de Novidade 2.2.4. Dimensão de Freqüência 2.2.5. Memória Explicita 2.2.6. Memória Atributiva 2.3. Intensificação e diversificação 2.3.1. Estratégia de intensificação 2.3.2. Estratégia de diversificação 2.4 Utilização de busca Tabu em escalonamento 2.4.1. Escalonamento para minimizar o tempo de comunicação em um sistema de multiprocessadores. 2.4.2. Escalonando tarefas de Multiprocessadores com Programas paralelos 2.4.3. Escalonando tarefas em Multiprocessadores usando busca tabu paralela. 3. Outros Algoritmos: Algoritmo de Programação Linear 4. Bibliografia 2 1.1 ESCALONAMENTO DE TAREFAS DE MULTIPROCESSADORES USANDO ALGORITMO GENÉTICO 1.1.1 Resumo: No problema de escalonamento para multiprocessadores, um dado programa deve ser escalonado em um dado sistema multiprocessador no qual o tempo de execução deve ser minimizado. Tem sido difícil encontrar uma solução exata para esse tipo de problema, existem muitos métodos heurísticos para encontrar um escalonamento quase ótimo. É proposto uma combinação, onde algoritmos genéticos são melhorados com a introdução de alguns conhecimentos sobre problemas de escalonamento representados pelo uso de uma lista de heurística nos operadores genéticos de crossover e mutação. Resultados de experimentos mostram que o uso dessa metodologia produz resultados bem melhores em termos de qualidade das soluções, apesar de ser lento em termos de tempo de execução. 1.1.2 Introdução: Em um sistema de multiprocessadores, cada processador tem sua própria memória e cada par de processadores comunicam-se exclusivamente por mensagens que trafegam através de uma rede de interconecção. Dado programa paralelo composto por tarefas de comunicações a serem executadas sob várias restrições de precedência. Para cada tarefa é associado um tempo de execução. Na ordem para ser executada, cada tarefa de um dado programa paralelo deve ser escalonada para algum processador de um dado sistema de multiprocessadores. Consequentemente, tarefas que se comunicam no programa paralelo devem ser escalonadas para diferentes processadores, que fazem esses processos se comunicarem durante a execução do programa paralelo. Essas comunicações diminuem a velocidade da execução do programa paralelo. Considerando essas comunicações e restrições de precedência entre tarefas, nos leva ao fato de que diferentes escalonamentos de cada tarefas satisfazendo as restrições de prioridade geram diferentes tempos de execução do programa paralelo. O problema de escalonamento de multiprocessadores consiste em encontrar o escalonamento de tarefas que minimize o tempo de execução dos programas paralelos e o números de processadores requeridos. No nosso caso, trataremos de uma versão mais simples do problemas, onde o número de processadores é fixo. Desde que uma busca exaustiva é impraticável, tem sido feito muito trabalho em métodos heurísticos rápidos para se encontrar soluções próximas da ótima. A maioria dos estudos de métodos heurísticos para escalonamento de multiprocessadores são chamados de lista de heurísticos. Um outro método heurístico usado no contexto do problema de escalonamento é o metaheurístico conhecido como algoritmo genético. Um algoritmo genético é um método de procura aleatória guiada onde os elementos (chamados indivíduos) em um dado conjunto de soluções (chamado população) são aleatoriamente combinadas (crossover) e modificadas (mutação) até que se atinja uma condição de parada. A população envolve iterações (gerações) no intuito de prover aptidão dos seus indivíduos. A aptidão de um indivíduo S1 é dita melhor que a de um indivíduo S2 se a solução correspondente à S1 está mais próxima da ótima que S2. Em cada iteração, o crossover gera uma nova população na qual supõem se que os indivíduos mantêm as boas características dos indivíduos das gerações anteriores. Um cromossomo representa uma prioridade para cada tarefa. Prioridades são definidas antes da execução, como o mais longo caminho de um nó até um nó que não envia mensagens. O algoritmo trabalha na prioridade através de padrões de crossover e mutação. 3 1.1.3 Escalonamento de multiprocessador: Um sistema de multiprocessador (homogêneo)é composto por por um conjunto P={p1,...,pm} de m processadores idênticos. Eles são conectados por uma rede de comunicação completa, onde os links são idênticos. Cada processador pode executar no máximo um tarefa por vez e a preempção não é permitida. Enquanto está computando, um processador pode se comunicar com um ou vários de seus links. O programa paralelo é descrito por um diagrama acíclico D=(T,A). Os vértices representam o conjunto T={t1,...,tn} de tarefas e cada curva representa a relação de precedência entre duas tarefas. Uma curva (ti1,ti2) pertencente à A representa o fato de que no final da execução, ti1 envia uma mensagem cujo conteúdo é requerido por ti2 para começar a executar. Nesse caso ti1 é dito ser um predecessor imediato de ti2, e ti2 é o sucessor imediato de ti1. Supondo que ti1 é a única tarefa sem nenhum predecessor imediato, um caminho é a seqüência de nós <ti1,...,tik>, 1<k<=n tal que ti1 é um predecessor de uma outra tarefa tik se existe um caminho <ti1,...,tik> em D. Para toda tarefa ti, é associado um valor representando sua duração, e assumimos que esses valores são conhecidos antes da execução do programa. Já a duração de todas as comunicações são conhecidas em tempo de compilação. Assim, para toda curva (ti1,ti2) pertencente à A existe um custo representando o tempo de transferência da mensagem enviada por ti1 para ti2. Se ambas mensagens destino e receptor são escalonadas para o mesmo processador, então o custo associado para essa curva se torna nulo. Um escalonamento é um vetor s = {s1,...,sn}, onde sj = {ti1,...tin}, sj é o conjunto das nj tarefas escalonadas para pj. Para cada tarefa ti pertencente a sj , l representa seu grau de execução em pj sob a alocação s. Para cada tarefa ti, nós denotamos p(ti,s) e r(ti,s), respectivamente o processador e o grau nesse de ti nesse processador sob a alocação s. O rendimento do tempo de execução por uma alocação é chamado makespan. Uma lista heurística constrói uma alocação passo a passo. As tarefas que podem ser alocadas (chamadas tarefas livres) são aquelas as quais todos predecessores já foram alocados. Então escolhemos uma dessas tarefas, dita ti, de acordo com uma certa regra R1. Escolhemos um processador dito pj, para qual ti será alocado de acordo com outra regra R2. Ao fazermos isso, acabamos de alocar ti para pj. Esse algoritmo acaba quando todas tarefas são alocadas. Afigura abaixo ilustra uma locação e as datas de introdução computadas por uma lista heurística. 4 O diagrama acíclico D mostrado nessa figura é composto de 5 tarefas, enquanto o sistema multiprocessador é composto de 3 processadores totalmente interconectados. Cada di indica o custo de ti e cada c(i1,i2) representa o tempo de comunicação associado à curva (ti1,ti2). A figura abaixo mostra uma alocação s das tarefas de D no sistema de multiprocessador mostrado. No diagrama são indicados o processador, a data de introdução, e a duração de cada tarefa de acordo com s, assim como o vetor representação da alocação s. 1.2 ESCALOMAMENTO PARA SISTEMAS DE PROCESSADORES PARALELOS 5 1.2.1 Resumo: Escalonamento de tarefas é essencial para o peculiar funcionamento de sistemas de processadores paralelos. Escalonamento de tarefas dentro de uma rede de processadores paralelos é um problema interessante que é bem definido e documentado na literatura. Entretanto a maioria das técnicas disponíveis são baseadas em heurísticas que resolvem certas instâncias do problema de escalonamento eficientemente e em uma quantia razoável de tempo. Nesse trabalho estudaremos um paradigma alternativo, baseado em algoritmos genéticos, para resolver eficientemente problemas de escalonamento sem precisar aplicar restrições de cada problema específico, assim como acontece quando se usa heurística. 1.2.2 Introdução: A impressionante proliferação no uso de sistemas de processamento paralelo é resultado de muitos avanços ao longo das últimas duas décadas. A maior questão na operação de sistemas de computação paralela é o do escalonamento, que também é um importante problema em diversas outras áreas. Em um sistema de processamento paralelo, poderíamos esperar uma melhora com o aumento do número de processadores usados. Entretanto, geralmente esse não é o caso devido aos fatores como overhead de comunicação, overhead de controle e restrições de precedência entre tarefas. A eficiência de um sistema de computação paralela é comumente medido pelo tempo de completamento, aceleração ou tempo de resposta, que refletem a qualidade do escalonador. Muitos métodos heurísticos tem dado soluções eficientes, entretanto somente para uma classe limitada de problemas de escalonamento. Nesse contexto encontramos uma aplicação que se encaixa perfeitamente para o uso de algoritmos genéticos. 1.3 Algoritmos Genéticos 1.3.1 Resumo: Esses algoritmos se baseiam na idéia da seleção natural, onde sobrevivem os mais adaptados. É um algoritmo eficaz quando buscas exaustivas são inviáveis devido ao crescimento exponencial de possíveis soluções no espaço de busca. 1.3.2 Introdução: Na natureza, os processos evolutivos ocorrem quando são satisfeitas as seguintes condições: • Há uma população de indivíduos que são capazes de se reproduzir; • Existe alguma diversidade entre os indivíduos que se reproduzem; • Há uma associação entre as diferenças na habilidade para sobreviver no ambiente em que vivem e esta variedade. A diversidade é garantida pela troca de cromossomos dos indivíduos durante a reprodução, acarretando uma variação na estrutura e comportamento desses indivíduos na população. A partir daí teremos indivíduos mais e menos aptos. Aquele que tem um maior grau de sobrevivência, adaptação e de reprodução é o mais apto (seleção natural). Com o passar do tempo, após várias gerações, teremos uma população alterada devido á seleção natural. Os algoritmos genéticos foram inspirados nos processos evolutivos que ocorrem na natureza. Uma algoritmo genético consiste em uma geração de uma população inicial de 6 indivíduos(processos), representado por identificadores(pid).Uma nova população é gerada aplicando-se operadores genéticos sobre esses processos, permitindo introduzir novos pontos num espaço de busca. Os principais operadores são chamados de reprodução e mutação. Reprodução: combinações entre processos gerando um novo. Mutação: alterações que geram indivíduos diferentes. Também é necessário um operador de seleção, que permite o algoritmo favorecer os indivíduos mais aptos, quando há mudanças de geração. Assim os bons são replicados enquanto os maus são descartados. Dentro desse contexto sobrevivem somente os elementos melhores da população total. Um algoritmo genético tem início com uma população inicial que evolui através de gerações. Essa evolução começa com uma população inicial aleatoriamente gerada. No nosso caso a aptidão de um indivíduo é definida pela diferença entre os makespan entre eles. O melhor indivíduo será aquele com melhor aptidão, ou seja, menor makespan. 1.3.3 O Algoritmo: Algoritmo genético(){ Gerar população inicial; Avaliar população; Enquanto critério de parada não satisfeito{ Selecionar processos para a próxima população; Aplicar mutação e crossing over; Avaliar população; } } Esse algoritmo foi desenvolvido por John Holland, na Universidade de Michigan em 1975, baseados nos princípios Darwinianos da evolução. 1. 2. 3. 4. Um algoritmo genético típico apresenta os seguintes componentes: Uma representação genética das soluções do problema; Uma forma de criar uma população inicial de soluções; Uma função de avaliação em termos de convergência e adaptação das soluções; Operadores genéticos que possam compor uma nova população e diferente das anteriores. Definido o mecanismo de codificação, deve-se primeiramente criar uma população inicial. Geralmente isso é feito de uma forma aleatória. Em seguida devemos avaliar essa população para se identificar os indivíduos mais aptos. Isso é feito através de uma função que pode ser chamada de ajuste ou avaliação(fitness function). Esta é aplicada na string de bits gerando o valor de aptidão de cada indivíduo(processo). Depois de se identificar tantos os processos mais aptos, quanto os menos aptos, entra em cena os operadores genéticos para se obter a próxima população. Tipicamente um algoritmo genético termina depois de um certo número de gerações ou se um nível de aptidão foi obtido, ou um ponto no espaço de busca foi atingido. 7 1.3.4 Cruzamento (ou crossover): Operador que estabelece uma combinação do cromossomo de dois processos gerando outros dois. O procedimento consiste em criar dois cromossomos filhos, cada um dos quais possuindo características dos dois pais. Essa combinação dá-se através de uma manipulação da codificação atribuída. Isso é feito com base na idéia de que se combinarmos características de processos bons, podemos obter outros ainda melhores, já que os dois novos podem aumentar o desempenho global do sistema. Um outro papel importante desse operador dentro do algoritmo, é garantir que as características presentes nas melhores populações se propaguem ao longo das gerações. Exemplo de crossover: Primeira mente vamos definir alguns símbolos Tarefa alright é uma tarefa que já foi calculada; Tarefa replace é aquela que precisa ser reposta; Tarefa release é aquela que precisa ser movida; Tarefa stay é aquela que não deve ser movida. (RRANDS) 8 Passo 1: O primeiro passo é encontrar os pontos de crossover. Isso é obtido por uma seleção aleatória de um ponto na primeira sub-string de A (A.1) e então movendo para o primeiro cliff após esse ponto. Um cliff é um ponto onde a altura de dois vizinhos são diferentes. Tendo aleatoriamente selecionado a tarefa 25 como o ponto de cross, o ponto de cross é movido para a tarefa 27, a qual é o próximo cliff. As tarefas depois da 27 na substring A.1 serão transferida para string B, e as tarefas anteriores, incluindo a 27, permanecerão em A. Um ponto “idêntico” deve ser encontrado na string B.1. A condição que deve ser satisfeita na altura das tarefas que ficarão em B.1 é <= à altura da tarefa 27 e a altura das tarefas movidas são > que a altura da tarefa 27(nesse exemplo). O ponto de croosover encontrado em B.1 é a tarefa 21. Passo 2: após selecionados o pontos de cross, as tarefas a serem movidas devem ser checadas pelo sistema de RRANDS (Replace, Release na Save) . 9 • • • Check Alright Tasks Para cada tarefa depois do ponto de cross A.1 faça: Se a tarefa em B.1, e depois do ponto de cross Marque como Alright; Check for Replace tasks and Stay tasks for string A.1 Para cada tarefa após o ponto de cross A.1 que não está marcado como Alright e não marcado como Release: Encontre tarefa irmã em B; Se a tarefa está após a sub-string corrente Marque como Replace; Senão Marque como Stay; Check for Release tasks and Stay tasks for string B.1 Para cada tarefa após o ponto de cross B.1 que não está marcado como Alright e não marcado como Replace: Encontre tarefa irmã em A; Se a tarefa está após a sub-string corrente Marque como Release; Senão Marque como Stay; 10 Passo 3: Uma vez que as tarefas foram marcadas, as sub-strings podem ser “crossed” (transferidas). Move-se todas as tarefas depois do ponto de cross A.1 para depois o ponto de cross B.1. As tarefas Stay devem ser movidas com suas próprias sub-strings para manterem a propriedade de ascensão. Passo 4: Uma vez que o “crossing” (transferência) da última tarefa é feito, o algoritmo deve prosseguir para a próxima sub-tring, assumindo que ela exista. Passo5: A seleção do próximo ponto de cross deve levar em consideração as tarefas de Release e Replace. Para a string A, as tarefas Releases representam uma duplicação das tarefas com a string completa. Como visto acima, string A tem duas cópias da tarefa 30. Isso viola uma das pré-condições (cada string deve ter uma e apenas uma cópia de cada tarefa). Tarefas de Replace representam uma falta de tarefas, tarefas 28 e 29 precisam ser repostas, então a string A poderá ter um conjunto completo de tarefas. O oposto acontece com B; tarefas de Replace representam uma duplicação, e tarefas Release representam uma falta. Uma tarefa Stay representa uma violação de uma e somente uma regra se a tarefa é movida. Um ponto de cross deve ser encontrado na string A.2, obedecendo as regras de cliff e de que sua altura é menor ou igual à altura das tarefas Release na string A.2 e tarefas de Replace da string B.2. Uma vez que o ponto de cross é encontrado, para ambas sub-strings, o passo 2 é repetido até que todas sub-strings são feitas. 11 1.3.5 Mutação: Operador que produz um cromossomo filho através da alteração aleatória na seqüência de bits(gene) de um cromossomo pai. Esse operador pode levar á criação de um processo mais apto, mas a característica mais relevante, é que assim se possibilita a diversificação dos processos. Mutação é aleatoriamente aplicada com uma baixa probabilidade, tipicamente na faixa dos 0,1 até 1,0 por cento. 1.3.6 Como algoritmos genéticos s diferenciam de outras técnicas de procura: Para os algoritmos genéticos superarem outras técnicas em termos de robustez, eles devem se diferenciar em alguns aspectos fundamentais: 1. Trabalha com um conjunto de codificação de parâmetros, não com os parâmetros por si só; 2. Procura apartir de uma população de pontos, não de um simples ponto; 3. Uso de playoff(função objetiva), não derivativas ou outros conhecimentos auxiliares; 4. Usa regras de transições probabilísticas e não determinísticas; 5. Codificação. 12 2. Algoritmo de Busca Tabu 2.1. Uma breve introdução A filosofia da busca tabu (tabu search, TS) é derivar e explorar uma coleção de princípios de resolução de problemas de inteligência. Neste sentido, pode se dizer que a pesquisa tabu é baseada em conceitos selecionados que unem o campo de inteligência artificial e otimização. A forma básica da busca tabu é fundamentada na idéia proposta por Fred Glover. O método é baseado em processos desenhados para cruzar os limites de factibilidade ou otimalidade local, que eram usualmente tratados como barreiras. Busca tabu é uma meta-heurística que orienta um processo de busca heurístico local para explorar o espaço de soluções além da otimalidade local. O processo local é uma busca que usa uma operação chamada move para definir a vizinhança de qualquer solução dada. Um dos principais componentes da busca tabu é o uso de memória adaptativa, que cria um comportamento de busca mais flexível. Estratégias baseadas em memória são portanto as marcas de aproximações da busca tabu. A busca tabu é baseada na premissa que a resolução de um problema, em ordem para ser qualificada como inteligente, precisa incorporar memória adaptativa e exploração de resolução. A memória adaptativa prove a implementação de processos que são capazes de procurar o espaço de solução de uma maneira econômica e eficiente. A ênfase em exploração de resposta em busca tabu deriva da suposição que uma má escolha de estratégia pode render mais informações do que uma boa escolha randomica. (Em um sistema que utiliza memória, uma má escolha baseada em estratégia pode prover boas dicas sobre como a estratégia pode proveitosamente se mudada) 2.2. O uso da memória. As estruturas de memória na busca tabu opera por referencia a quatro dimensões principais. Constituindo novidade, freqüência, qualidade, e influência. 13 2.2.1. Dimensão de Qualidade A dimensão de qualidade refere-se a habilidade para diferenciar o valor das soluções visitadas durante a busca. Neste contexto a memória pode ser utilizada para identificar elementos que possuem soluções ótimas comuns ou caminhos que conduzem a estas soluções. Operacionalmente, qualidade se torna o fundamento para o incentivo base de aprendizagem, onde induções são tomadas para desencorajar ações que conduzam para más soluções. 2.2.2. Dimensão de Influência A dimensão de influência, considera o impacto que as escolhas provocam durante a busca, não somente em qualidade mas também em estrutura. Gravando informações sobre a influência das escolhas tomadas em uma particular solução incorpora um nível adicional de aprendizado. 2.2.3. Dimensão de Novidade O tipo de memória que observa os atributos das soluções que foram modificados durante um passado recente é chamada de memória baseada em novidade. Para explorar esta memória, selecionados atributos que ocorrem em soluções recentemente visitadas são chamados de tabu-active, e soluções que possuem atributos tabu-active, ou uma combinação particular desses atributos, são aquelas que se tornam tabu. Isto previne que certas soluções de um passado recente pertença a uma vizinhança modificada da solução anterior, e nem seja revisitada. 2.2.4. Dimensão de Freqüência Memória baseada em freqüência prove um tipo de informação que complementa a informação provida pela memória baseada em novidades, ampliando o fundamento para seleção de moves preferidos. Assim como na memória baseada em novidades, freqüência muitas vezes é pesada e decomposta em varias subclasses levando em consideração a dimensão da qualidade da solução e a influência do movimento. A memória usada na busca tabu é tanto explicita como atributiva. 2.2.5. Memória Explicita A memória explicita grava a solução completa, tipicamente considerando um conjunto de soluções visitadas durante o processo de busca. Uma extensão desta memória grava informações sobre as vizinhanças da elite de soluções. A elite de soluções (ou suas vizinhanças) memorizado são utilizados para expandir a busca local. Em alguns casos a memória explicita é utilizada para que a busca evite visitar a mesma solução duas vezes. 14 2.2.6. Memória Atributiva Como alternativa, a busca tabu utiliza memória atributiva. Este tipo de memória grava informação sobre os atributos da solução que mudam na movimentação de uma solução para outra. Por exemplo, no escalonamento de produções, o indicador de trabalhos deve ser utilizado como atributo para inibir ou encorajar o método a continuar a procura em determinada direção. 2.3. Intensificação e diversificação Dois componentes muito importantes da busca tabu são as estratégias de intensificação e de diversificação. 2.3.1. Estratégia de intensificação Estratégias de intensificação são baseadas em regras de modificação que encorajam a combinação de movimentos e características históricas das soluções achadas ótimas. Esta estratégia começa sua resposta analisando mais profundamente a vizinhança da resposta anterior. Como uma elite de soluções devem ser gravados para que seja possível a analise de sua vizinhança, memória explicita é claramente relacionada com a implementação de estratégias de intensificação. 2.3.2. Estratégia de diversificação A estratégia de diversificação, por outro lado, encoraja o processo de busca para examinar regiões não visitadas e a gerar soluções que diferem em vários aspectos daquelas que foram vistas anteriormente. Um exemplo gráfico de intensificação de diversificação pode ser observado: 15 2.4 Utilização de busca TABU em escalonamento 2.4.1. Escalonamento para minimizar o tempo de comunicação em um sistema de multiprocessadores Máquinas Conexionistas (Connectionist Machines) estão atraindo grande atenção para seus valores como uma proliferação de arquiteturas de computadores maciçamente paralelos. Isto é particularmente verdade para a resolução de problemas de otimização combinatória aparecendo em uma variedade de aplicações de engenharia. Ao mesmo tempo, o objetivo do desenvolvimento e implementação de máquinas conexinistas introduz problemas desafiantes de otimização. Um problema importante é de minimizar o tempo de comunicação requerido para uma máquina conexionista. O tempo de comunicação freqüentemente é um determinante crucial de tudo que abrange custo e eficiência. Em uma classe significante de aplicativos, como analise de elementos finitos, a comunicação padrão é estática. A localização da memória definindo a origem e os destinos das mensagens não é modificada nesses aplicativos, apenas os dados comunicados variam. Melhores construções para alocação de processadores de acordo com a estrutura padrão de comunicação oferece um considerável potencial para reduzir custos e tempo. Foi desenvolvido por Chakrapani e Skorin-Kapov (1995) um método efetivo de busca tabu para o problema de mapeamento de tarefas para processadores para minimizar o tempo de comunicação em um sistema multiprocessador. O método incorpora a implementação de um processamento paralelo que inclui a memória da busca tabu e guia mecanismos para iterativamente selecionar pares de tarefas e troca-las de processador. A implementação envolve dois níveis de paralelismo. Primeiro, a tarefa candidata para ser trocada é identificada em paralelo. Segundo, mais do que um par de tarefas são trocadas em um simples iteração. Esta estratégia é desenvolvida para operar com aproximações eficientes. Os autores propõem uma diversificação desta estratégia que faz a busca robusta sobre essas circunstancias. 2.4.2. Escalonando tarefas de Multiprocessadores com Programas paralelos Quando programas de aplicação paralelos são executados em maquinas MIMD, a porção paralela da aplicação pode ser acelerada de acordo com o número de processadores alocados nela. Em uma arquitetura homogênea, onde todos os processadores são idênticos, a porção seqüencial do programa terá que ser executada em um desses processadores, degradando consideravelmente o tempo de execução. Em uma estrutura heterogênea, onde um processador rápido, responsável por executar a porção seqüencial de uma aplicação paralela e é fortemente acoplada a menores processadores, melhores performances devem ser alcançadas. O processo de determinar as tarefas de determinado processador (escalonamento de tarefas) é mais complexo no caso de um sistema heterogêneo, onde os processadores tem taxas de processamento distintas. Porto e Ribeiro (1995a) tem aplicado busca tabu para o problemas de escalonamento de tarefas em um ambiente heterogêneo de multiprocessadores sobre 16 obstáculos precedentes. Uma série parâmetros e estratégias de busca tabu foi estudada lado a lado com uma variedade de gráficos precedentes de tarefas ( topologia, número de tarefas, serial fraction, demanda de serviço de cada tarefa) e a configuração do sistema (número de processadores, medida de heterogeneidade da arquitetura pelo poder médio de processamento). O algoritmo por si só é muito robusto e efetivo, sistematicamente melhora em aproximadamente 25% o makespan das soluções obtidas pelo algoritmo que prove a solução inicial. 2.4.3. Escalonando tarefas em Multiprocessadores usando busca tabu paralela. Porto e Ribeiro (1995b) tem desenvolvido e implementado estratégias de busca tabu de paralelização para o problema de escalonamento de tarefas para multiprocessadores. Paralelização conta com exclusivamente com a decomposição da exploração do espaço de solução. O problema de escalonamento de tarefas considerado neste estudo é caracterizado por uma grande estrutura de vizinhança, que não só reduz o tempo de computação mas produz melhores soluções para muitos problemas de teste. 3. Outros Algoritmos: Programação Linear Uma outra forma alternativa de se escalonar processos é através da programação linear (P.L.). A programação linear e o Método Simplex foram desenvolvidos por Dantzig em 1947, com o apoio do serviço militar dos EUA. A P.L. é frequentemente usada como parte de vários esquemas para solucionar problemas de programação não-linear, problemas discretos, problemas combinatórios, problemas de controle de otimalidade e programação sob incerteza. Um problema de P.L. é um problema de minimização ou maximização de uma função linear na presença de restrições lineares de uma inequação e/ou equação. No nosso estudo estaremos interesados em maximizar o rendimento do tempo de execução (makespan), restrito a uma alocação de processos. max C1 X1 + C2 X2 + ... + Cn Xn = z sujeito a a11 X1 + a12 X2 + ... + a1n Xn >= b1 a21 X1 + a22 X2 + ... + a2n Xn >= b2 . . . . . . . . . . . . am1 X1 + m12 X2 + ... + m1n Xn >= bm X1, X2, ..., Xn >=0 17 O Método simplex é usado para solucionar o problema descrito acima. 4. Bibliografia Glover, Fred and Laguna Manuel (1997) “Tabu Search” Kluwer Academic Publishers 18