Modelo de Atribuição Assíncrona de Tarefas utilizando Memória Compartilhada



Documentos relacionados
Cálculo Aproximado do número PI utilizando Programação Paralela

SISTEMAS OPERACIONAIS CAPÍTULO 3 CONCORRÊNCIA

Arquitetura dos Sistemas de Informação Distribuídos

Escalonamento no Linux e no Windows NT/2000/XP

Processos e Threads (partes I e II)

Sistemas Distribuídos

Notas da Aula 17 - Fundamentos de Sistemas Operacionais

Notas da Aula 4 - Fundamentos de Sistemas Operacionais

Comparativo de desempenho do Pervasive PSQL v11

ORGANIZAÇÃO DE COMPUTADORES MÓDULO 8

Capítulo 3. Avaliação de Desempenho. 3.1 Definição de Desempenho

ESTUDO DE CASO WINDOWS VISTA

MÓDULO 8 ARQUITETURA DOS SISTEMAS DE BANCO DE DADOS

1

Paralelismo. Computadores de alto-desempenho são utilizados em diversas áreas:

ISO/IEC 12207: Gerência de Configuração

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Faculdades Santa Cruz - Inove. Plano de Aula Base: Livro - Distributed Systems Professor: Jean Louis de Oliveira.

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia.

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware

Guilherme Pina Cardim. Relatório de Sistemas Operacionais I

Arquitetura de Banco de Dados

Sistemas Operacionais Aula 06: Threads. Ezequiel R. Zorzal

Disciplina: Introdução à Informática Profª Érica Barcelos

Aplicação de Modelo de Programação Híbrido na Espacialização do Relevo no Submédio do São Francisco

Itinerários de Ônibus Relatório Final

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

ENGENHARIA DE SOFTWARE I

Udesc/Ceplan Bacharelado em Sistemas de Informação Sistemas Operacionais. Prof. Alexandre Veloso

Imagem retirada de documentações de treinamentos oficiais INTEL

2 Diagrama de Caso de Uso

UNIVERSIDADE FEDERAL DE SANTA CATARINA UFSC DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA INE BACHARELADO EM CIÊNCIAS DA COMPUTAÇÃO.

Sistemas Distribuídos

Ministério da Educação Secretaria de Educação Profissional e Tecnológica Instituto Federal de Educação, Ciência e Tecnologia do Rio Grande do Sul

Feature-Driven Development

ANÁLISE DE DESEMPENHO DA PARALELIZAÇÃO DO CÁLCULO DE NÚMEROS PRIMOS UTILIZANDO PTHREAD E OPENMP 1

BARRAMENTO DO SISTEMA

Programação Concorrente Processos e Threads

Sistemas de Informação I

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

Computadores de Programação (MAB353)

TRABALHO COM GRANDES MONTAGENS

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa

Sistema Operacional Correção - Exercício de Revisão

Curso de Instalação e Gestão de Redes Informáticas

Eduardo Bezerra. Editora Campus/Elsevier

Capítulo 8 Arquitetura de Computadores Paralelos

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Sistemas Operativos. Threads. 3º ano - ESI e IGE (2011/2012) Engenheiro Anilton Silva Fernandes (afernandes@unipiaget.cv)

Módulo 4. Construindo uma solução OLAP

Everson Scherrer Borges João Paulo de Brito Gonçalves

Arquitetura de Computadores. Sistemas Operacionais IV

Taxa de Gravação da Memória RAM (MegaBytes / segundo) G5 2.7 Ghz (Mac) Linux Kernel

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

Administração de Sistemas de Informação Gerenciais

Técnicas de Manutenção de Computadores

Balanceamento de Carga

Ao longo do presente capítulo será apresentada uma descrição introdutória da tecnologia FPGA e dos módulos básicos que a constitui.

Banco de Dados. Introdução. João Eduardo Ferreira Osvaldo Kotaro Takai. DCC-IME-USP

Programação Concorrente Introdução

SISTEMAS OPERACIONAIS

Bancos de dados distribuídos Prof. Tiago Eugenio de Melo

Sistemas Operacionais

Metodologias de Desenvolvimento de Sistemas. Analise de Sistemas I UNIPAC Rodrigo Videschi

AULA4: PROCESSADORES. Figura 1 Processadores Intel e AMD.

O que veremos nesta aula? Principais Aspectos de Sistemas Operacionais. Visão geral de um sistema computacional

Sistemas Operacionais

Módulo 15 Resumo. Módulo I Cultura da Informação

28/9/2010. Paralelismo no nível de instruções Processadores superescalares

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 02 - Estrutura dos Sistemas Operacionais. Cursos de Computação

5 Mecanismo de seleção de componentes

Dadas a base e a altura de um triangulo, determinar sua área.

3 SCS: Sistema de Componentes de Software

Entrar neste site/arquivo e estudar esse aplicativo Prof. Ricardo César de Carvalho

Faculdade Integrada do Ceará FIC Graduação em Redes de Computadores

Planejando o aplicativo

Sistemas Operacionais

29/3/2011. Primeira unidade de execução (pipe U): unidade de processamento completa, capaz de processar qualquer instrução;

4 Estrutura do Sistema Operacional Kernel

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

Organização e Arquitetura de Computadores I. de Computadores

Estruturas do Sistema de Computação

Sistemas Operacionais Gerência de Dispositivos

Arquiteturas RISC. (Reduced Instructions Set Computers)

Organização e Arquitetura de Computadores I. de Computadores

Sistemas Operacionais Processos e Threads

Sistemas Distribuídos

MÓDULO 7 Modelo OSI. 7.1 Serviços Versus Protocolos

Engenharia de Software: conceitos e aplicações. Prof. Tiago Eugenio de Melo, MSc tiagodemelo@gmail.com

Histórico da Revisão. Versão Descrição Autor. 1.0 Versão Inicial

Para construção dos modelos físicos, será estudado o modelo Relacional como originalmente proposto por Codd.

Admistração de Redes de Computadores (ARC)

IMPLEMENTAÇÃO DE SOCKETS E THREADS NO DESENVOLVIMENTO DE SISTEMAS CLIENTE / SERVIDOR: UM ESTUDO EM VB.NET

Orientação a Objetos

ARQUITETURA DE COMPUTADORES

7.Conclusão e Trabalhos Futuros

UFG - Instituto de Informática

Transcrição:

ERMAC 2010: I ENCONTRO REGIONAL DE MATEMÁTICA APLICADA E COMPUTACIONAL 11-13 de Novembro de 2010, São João del-rei, MG; pg 244-250 244 Modelo de Atribuição Assíncrona de Tarefas utilizando Memória Compartilhada Murilo Boratto, Saulo O. D. Luiz, Colegiado de Engenharia da Computação (CECOMP) Universidade do Vale do São Frascisco - UNIVASF 48902-300, Juazeiro, Bahia, Brasil E-mail: murilo.boratto@univasf.edu.br, saulo.dornellas@univasf.edu.br, Leandro Coelho Núcleo de Arquitetura de Computadores e Sistemas Operacionais (ACSO) Universidade do Estado da Bahia - UNEB 41195-001, Salvador, Bahia, Brasil E-mail: leandrocoelho@uneb.br. Resumo: A crescente necessidade de poder computacional dos tempos modernos vem justificar o grande avanço na busca de técnicas que decrementam o tempo de resposta para problemas computacionais usuais. Em uma razão inversamente proporcional às limitações físicas do hardware, a utilização cada vez mais comum de sistemas multicores faz com que o fator limitante do desempenho desse sistema seja o mau aproveitamento de sua total potencialidade. Neste trabalho, propomos uma técnica de otimização de distribuição da carga de trabalho em máquinas paralelas, com o objetivo de aumentar o número de instruções executadas por ciclo de clock. Para isso, foi proposto um algoritmo de Resolução de um Sistema de Equações Lineares Triangular por Blocos para um modelo com atribuição assíncrona de tarefas para memória compartilhada. Palavras-chave: Métodos Numéricos e Aplicações,, Computação Paralela e Distribuída, OpenMP. 1. Introdução Os processadores se tornaram, progressivamente, cada vez mais rápidos e, em um ritmo veloz, as empresas fabricantes de circuitos integrados têm uma necessidade bem definida de continuar produzindo processadores com desempenho cada vez melhor. Este aumento de desempenho decorre basicamente da diminuição do tamanho de seus componentes e pelo aumento da velocidade do clock dos processadores. Entretanto componentes físicos estão alcançando um tamanho tão pequeno que em breve eles não poderão mais diminuir de tamanho. Na medida que este limitante físico não pôde mais ser alterado, os fabricantes foram obrigados a criar alternativas para os processadores, incluindo em sua estrutura vários núcleos (multicores) [9]. O processador multicore apresenta ganho em desempenho baseado no número de núcleos que oferece, sendo uma tendência futura que todos os computadores de uso pessoal, servidores, sistemas embarcados,etc... estejam dotados de processadores multicores de alta capacidade. Ao passo que este futuro se aproxima, cabe aos desenvolvedores de software criar programas que sejam superescaláveis, sendo muito provável que um programa escrito atualmente precise ser totalmente modificado para adaptar-se às máquinas com mais processadores. Para suprir esta necessidade, foram criados padrões de manipulação, tendo na inserção de diretivas sobre o código já existente, a modificação necessária para que o usuário não precise atuar radicalmente sua aplicação para contar com os benefícios de um ambiente multiprocessado. O objetivo deste trabalho é apresentar uma técnica de otimização de distribuição da carga de trabalho, através da atribuição assíncrona de tarefas para um modelo de memória

245 compartilhada. O trabalho esta estruturado da seguinte forma: Na Seção 2 abordaremos o problema da Resolução do Sistema de Equações Lineares Triangular. Na Seção 3 explicaremos a Arquitetura Multicore. Na Seção 4 apresentaremos a o Método de Atribuição Assíncrona de Tarefas proposto. Na Seção 5 apresentaremos os Resultados Experimentais, e no final fecharemos o artigo com Conclusões e Trabalhos Futuros. 2. Resolução do Sistema de Equações Lineares Triangular A importância do estudo de Sistemas de Equações Lineares surge a partir do momento em que esse tipo de sistema está presente em vários problemas de modelagem computacional nas áreas de engenharia, matemática, física e ciências afins. Um sistema de equações lineares é composto de um conjunto finito de n equações e n variáveis independentes entre si. Os Sistemas de Equações Lineares também podem ser escritos em um formato matricial [8], sendo representado pela matriz dos coeficientes A, pela matriz das incógnitas X e pela matriz das soluções b, conforme a fórmula AX = b: a 11 x 1 +... +a 1n x n = b 1 0x 1 +... +a 2n x n = b 2. 0x 1 +... +a nn x n = b n a 11 a 12 a 1n a 22 a 2n..... 0 a nn x 1 x 2. x n b 1 = b 2. b n x n = b n a nn x i = b j=i+1 i a j=n ij b j a ii i=n 1,...,1 onde x 1, x 2, x 3,.., x n são as variáveis independentes, a ij são os coeficientes do sistema e b i são os termos independentes, considerando os índices i=1,2,...,n e j=1,2,...,n. O sistema nessa forma tem todos os coeficientes nulos abaixo da diagonal sendo resolvido por um procedimento chamado de substituição regressiva. Ele começa com a última equação, que é resolvida para o valor de x n. O valor de x n é então substituído na equação anterior, que é resolvida para x n 1. O processo continua da mesma maneira até alcançar a primeira equação, sendo similar o mesmo raciocínio e formulação para o Sistema Triangular Inferior. 2.1. Método Numérico de Resolução de Sistemas Lineares Triangulares por Blocos O Método Numérico por Blocos resolve os Sistemas de Equações Lineares Triangular de maneira mais rápida e eficiente seguindo um algoritmo iterativo. Como a quantidade de variáveis do sistema determinará a complexidade e o tempo de resolução, modifica-se a resolução sequencial simples, elemento a elemento, para uma metodologia por blocos. O algoritmo consiste em particionar a representação matricial A de ordem n em blocos simétricos de tamanho tb e, a cada momento em que se resolve um bloco, ocorre a atualização da matriz solução, assim quando o último bloco é resolvido a matriz solução contém os valores das variáveis que validam o sistema de equações. No conjunto de blocos existem inúmeras dependências entre eles, com exceção do primeiro bloco que contém o elemento a 11. As relações de dependências podem ser verificadas na Figura 1. Podemos perceber que os blocos que contêm os elementos da diagonal principal (blocos 1, 5, 8 e 10) quando resolvidos liberam vários blocos inferiores que estarão aptos a serem resolvidos de forma simultânea. Este fato possibilita o uso de paralelismo computacional que verificaremos nas próximas seções deste artigo. 3. Arquitetura Multicore A maioria dos sistemas atuais é baseada em processadores de mais de um núcleo, sendo que cada núcleo possui seu próprio cache e alguns casos realizam acesso direto e independente à memória principal. Estes sistemas possibilitam que as instruções de aplicações sejam executadas em paralelo, ou seja, cada processador realiza os cálculos de que é requisitado concorrentemente com o outro, ganhando desempenho [6]. Essa capacidade de processamento, principalmente quando se trata da execução de mais de um aplicativo, faz com que se consiga trabalhar com dois ou mais núcleos concorrentemente, tendo nos processadores uma melhora no acesso à memória e na troca de dados entre os próprios núcleos. Os

246 Figura 1. Dependência da Estrutura Matricial por Blocos. núcleos dos processadores estão diretamente conectados, onde cada núcleo possui todas as características de um processador. Essa nova arquitetura abre portas para que novos processadores recebam números cada vez maiores de núcleos. A existência de um número tão grande de núcleos, começa a requerer a utilização de um esquema de balanceamento e distribuição de cargas e metodologias de otimização de código através da inserção de paradigmas de paralelismo [5, 12]. 3.1. Paradigma de Memória Compartilhada A Memória Compartilhada [3] é uma memória que pode ser acessada simultaneamente por múltiplos programas com a intenção de prover comunicação entre eles ou para evitar cópias redundantes. Dependendo do contexto, os programas podem ser executados em somente um processador ou por pelo menos dois processadores distintos. 3.2. OpenMP E, dentro deste contexto, usou-se uma ferramenta para compor o modelo paralelo chamada de OpenMP (Open Multi-Processing) [1, 7], que é uma biblioteca que suporta o paradigma de memória compartilhada para programação em C, C++ e Fortran em várias arquiteturas. É constituída por um conjunto de diretivas de compilação, variáveis de ambiente e funções que influenciam na execução do programa. O OpenMP é um modelo portátil e otimizado que dá aos programadores uma interface simples e flexível para o desenvolvimento de aplicações paralelas para plataformas que vão desde um computador pessoal até um supercomputador. A implementação do paralelismo faz-se a partir da inicialização de threads [3], onde cada linha de execução concorrente executa a seção do código paralelo independentemente. Áreas paralelas podem ser criadas para dividir uma tarefa entre as threads de modo que cada uma execute a sua parte do código atribuído. 4. Implementação Paralela do Algoritmo Resolução de Sistemas Equações Triangular por Blocos A Implementação Paralela do Algoritmo por Blocos foi feita aproveitando o particionamento intrínseco da própria estrutura algorítmica, sendo resolvida em partes menores independentemente. Utilizamos o modelo de memória compartilhada, tendo como base um entorno multi-núcleos para um estudo detalhado para o comportamento do algoritmo nesse ambiente. 4.1. Modelo Produtor-Consumidor O modelo de sincronização das tarefas utilizado foi um modelo clássico para múltiplos processos, chamado paradigma Produtor-Consumidor [3]. Inicialmente o paradigma descreve 2 processos: 1 produtor e 1 consumidor, os quais compartilham uma área comum de memória chamada de buffer. As tarefas são geradas pelos produtores em partes menores, sendo colocados no buffer por processo(s) produtor(es) para

247 que, em algum momento, estas tarefas sejam removidas e consumidas por processo(s) consumidor(es). A premissa básica desse paradigma é que o produtor não poderá adicionar mais tarefas se o buffer estiver cheio e o consumidor não poderá remover se o buffer estiver vazio. Como analisamos anteriormente, os blocos que contém elementos da diagonal principal da matriz liberam uma maior quantidade de blocos que poderão ser processados simultaneamente. A partir disso estes blocos foram colocados à frente da lista de tarefas do produtor pelo fato de sua resolução parcial agilizar a execução do sistema. Enquanto os outros blocos são inseridos ao final da lista. No momento em que uma thread acaba de processar um bloco ela busca na lista de tarefas os blocos contidos no início da lista. Essa solução gera uma condição de corrida de acesso a recursos compartilhados, onde tal corrida seria resolvida com a implementação de chamadas de bloqueios de execução (locks), através de semáforos. Porém, tendo em vista a complexidade da solução, optou-se por uma solução mais simples e otimizada para o problema proposto. Decidiu-se criar regiões críticas [3] onde cada processo concorrente executa sua tarefa por vez. Para o problema proposto foi adotada como região crítica a parte do algoritmo que atualiza a matriz solução b, em que cada thread consumidora acessa exclusivamente o recurso compartilhado por vez, garantindo a integridade dos dados e/ou evitando o conflito pelo recurso disponível, já que um único erro influenciará no resultado final do sistema. 4.2. Desenho do Modelo Paralelo de Distribuição Assíncrona O Modelo Paralelo de Distribuição Assíncrona tem como principal dificuldade a computação das dependências, ou melhor, a ordem de resolução dos blocos. Essa ordem faz com que se tenha uma gerência na ordem de execução, sendo criado para isso uma entidade chamada de Matriz de Referência. A Matriz de Referência é uma estrutura de dados criada para armazenar o estado das tarefas a serem computadas, na figura 2 é mostrado um diagrama com o estado inicial de uma Matriz de Referência de ordem 8 e tamanho de bloco 2, juntamente com as transições ao longo da execução: Figura 2. Estrutura da Tabela de Dependências para o Modelo Produtor-Consumidor. As definições estabelecidas mostram que a execução será feita na ordem do decremento das dependências. A sintaxe de atribuição dos valores -1, 0, 1 e 2 correspondem respectivamente aos estados: Tarefa feita, Tarefa por fazer, Tarefa com dependência simples e Tarefa com dependência dupla. A correspondência entre o Modelo Produtor-Consumidor faz com que seja realizada a execução até que o último elemento da tabela seja igual a -1. O esquema de atribuição assíncrona de tarefas consiste em duas partes principais: uma primeira parte fica encarregada de encher uma lista de tarefas tendo como referência a precedência entre os blocos da matriz de adjacência. A lista de tarefas é preenchida tendo como fator de atualização a partir da liberação das dependências. A fim de otimizar o processo, decidiu-se dar preferência às tarefas contidas na diagonal principal da matriz, já que pela estrutura da resolução do método, ocorre uma maior liberação de tarefas do que em outras posições. Uma segunda etapa é composta pelo consumo das tarefas pelo conjunto de thread. A assincronia da execução das tarefas tem como consequência uma alta escalabilidade, sendo expressa nos resultados experimentais de tempo de execução e de desempenho do algoritmo.

248 5. Resultados Experimentais Esta seção mostra os resultados experimentais dos algoritmos implementados para a Resolução de Sistemas de Equações Lineares Triangular. 5.1. Caracterização do ambiente de experimentação Utilizou-se uma rede heterogênea de máquinas Linux composta por 17 processadores, denominada Cluster SOL, estando localizada no laboratório de computação paralela na Universidade de Murcia (UM). Os experimentos foram realizados em uma arquitetura contendo 4 processadores, chamadas de tetraprocessador. A Tabela 1 mostra as características da mesma, incluindo sua arquitetura, o relógio, as quantidades de núcleos por nodo, compilador e bibliotecas usadas. Utilizamos o compilador icc e a biblioteca MKL para LAPACK [2], ambos proprietários da Intel com suporte a API OpemMP [7] e, além disso, usamos a opção de otimização do compilador -O3. Depois de executar o código várias vezes com diferentes tamanhos de problema para diferentes tamanhos de bloco e variando o número de threads para o problema definido, através de um código executável, obtivemos uma melhora significativa no tempo de execução. Tivemos como parâmetro uma implementação sequencial baseada na rotina DTRSV [4] versus uma versão paralela de atribuição assíncrona de tarefas com amostras randômicas para as matrizes de entrada. Tabela 1. Principais Características do Sistema de Execução os quais foram obtidos os Resultados Experimentais. Arquitetura tetraprocessador Intel R Xeon Processadores 4 Clock Cores Memória Compilador 3 GHz 2 por processador 2 GB icc API MKL Intel 9.1.046 5.2. Experimentação com Parâmetros do Algoritmo Os testes foram feitos variando os valores de tamanho do problema, número de threads e tamanho de bloco para cada tipo de ambiente utilizado nos testes. A partir dos valores de tempos de execução encontrados, obteve-se o melhor número de threads e o melhor tamanho de bloco, sendo a melhor combinação entre os parâmetros em cada plataforma. Mostramos na Tabela 2 os valores obtidos para a máquina tetraprocessador. Nos experimentos variamos o número de threads e vimos que no tetraprocessador se trabalha em menos tempo utilizando blocos de dimensão 64, sendo justificada pela exploração dos níveis de cache da arquitetura multicore ajustada perfeitamente ao tamanho de bloco encontrado. Como percebemos através de nossos testes, o tempo para a resolução do sistema de equações triangular (valores em negrito) diminui com o aumento do número de threads inicializadas, até a obtenção de um ótimo. Esse fato contribui para que o algoritmo obtenha resultados ainda melhores quando conseguimos juntar os melhores parâmetros do algoritmo junto à plataforma de execução. No entanto, a assincronia entre as tarefas se vê prejudicada sem esses parâmetros, fazendo com que o rendimento do algoritmo, em alguns casos, seja muito pior que a execução sequencial. Na Tabela 2 mostramos os mesmos experimentos feitos na máquina tetraprocessador. Os resultados possuem o mesmo comportamento, mas com uma ascendência de potencialidade devido a um incremento no número de processadores e de cores no nodo experimentado.

249 Tabela 2. Tempo de Execução (em segundos) no tetraprocessador. nth/dim. 1600 3200 4800 6400 8000 9600 1 0.008 0.027 0.061 0.10 0.16 0.22 2 0.009 0.035 0.091 0.14 0.25 0.35 4 0.005 0.021 0.0452 0.08 0.12 0.17 6 0.05 0.069 0.24 0.27 0.33 0.49 8 0.14 0.22 0.30 0.32 0.42 0.45 Observando a Tabela 2 para o tamanho de bloco ótimo experimentado, pode-se ver que o tempo para o cálculo das tarefas diminui com o número de threads utilizado. Esta redução do tempo é natural até 4 threads uma vez que o número de núcleos é 8. Além disso, a assincronia aporta ao algoritmo uma superescalabilidade frente à memória distribuída, tendo na gerência das tarefas realizadas um equilíbrio das cargas de trabalho entre a execução das threads. Da mesma forma os gráficos da Figura 3 a seguir também mostram o comportamento na máquina tetraprocessador, porém mostrando um incremento do poder de computação nos resultados experimentais para o tempo de execução e speedup na máquina. 3 2.5 Lapack Threads=2 Threads=4 Threads=8 Threads=16 Tempo Experimental Tetraprocessador (Threads=4 e Tamanho de Bloco=64) 3 2.5 Speedup Tetraprocessador (Threads=4 e Tamanho de Bloco=64) Tempo(segundos) 2 1.5 1 Speedup (segundos) 2 1.5 1 0.5 0.5 0 0 2000 4000 6000 8000 10000 12000 14000 Dimensao da Matriz 0 0 2000 4000 6000 8000 10000 12000 14000 Dimensao da Matriz Figura 3. Tempos experimentais obtidos com o tetraprocessador. 6. Conclusões e Trabalhos Futuros Dentre as principais ferramentas de desenvolvimento para obtenção de máximo desempenho de sistemas multicores temos as bibliotecas pthreads [10], OpenMP e TBB [11], e fazendo uma análise comparativa entre todas elas percebe-se que OpenMP possui uma enorme potencialidade e simplicidade estrutural sob as outras ferramentas. A fim de obter o máxima desempenho do multi-núcleos, é necessário dividir o problema em muitas tarefas com uma alta granularidade e assincronia da distribuição das tarefas. O desenvolvimento de uma programação com pthreads é mais complexo do que com seus homólogos OpenMP e TBB, já que uma vez que o programador tem um maior controle sobre o algoritmo, consegue evitar pontos de sincronismo que tendem a diminuir o desempenho neste tipo de arquiteturas. O algoritmo é baseado na idéia de explorar toda a potencialidade incorporada às rotinas LAPACK unida ao modelo desenvolvido de assincronia tendo a base no Modelo Produtor Consumidor, sendo desenvolvido para explorar todas as características arquitetônicas da plataforma de múltiplos núcleos, sendo previsto uma projeção futura de elevação de desempenho com o aumento do número de núcleos. Os resultados experimentais obtidos neste trabalho indicam que o modelo proposto é eficiente, tendo como base a classificação de tarefas, tempo de resposta e distribuição da carga de trabalho. O modelo construído demonstra qual a mensuração do poder de computação multi-núcleos combinando o paralelismo intrínseco do algoritmo às adequações e às ferramentas de software que utilizamos na execução. Como sempre, ainda há muito a fazer como, por exemplo, a etapa triangularização [6] da ma-

250 triz de adjacência até chegar a estrutura triangular inferior ou superior por blocos, através de um método mais rápido [7]. Talvez modelos de programação alternativa deva ser propostos para tornar possível a transformação de códigos legados para sistemas multicore. Finalmente, o nosso objetivo para o futuro é estender o algoritmo a outras plataformas heterogêneas mesclando ferramentas mais poderosas para lidar com esta arquitetura. Referências [1] OpenMP API. Disponível em: http://www.openmp.org. [2] Intel Math Kernel Library for Linux. User s Guide. Disponível em: http://developer.intel.com, October 2007. [3] F. Almeida, D. Gimenéz, J. M. Mantas, and Antonio M. Vidal. Introducción a la Programación Paralela. Paraninfo Cengage Learning, España, Madrid, 2008. [4] E. Anderson, Z. Bai, C. Bischof, J. Demmel, J. Dongarra, J. Du Croz, A. Greenbaum, S. Hammarling, A. McKenney, S. Ostrouchov, and D. Sorensen. LAPACK Users Guide. SIAM, Philadelphia, second edition, 1999. [5] M. Boratto, P. Alonso, and A. M. Vidal. A Threaded Divide and Conquer Symmetric Tridiagonal Eigensolver on Multicore Systems. In ISPDC, pages 464 468, 2008. [6] A. Buttari, J. Langou, J. Kurzak, and J. Dongarra. Lapack Working Note 190: Parallel Tiled QR Factorization for Multicore Architectures. Technical Report UT-CS-07-598, Department of Electrical Engineering and Computer Science, University of Tennessee, 2007. [7] L. Dagum and R. Menon. OpenMP: An industry-standard API for shared-memory programming. IEEE Comput. Sci. Eng., 5(1):46 55, 1998. [8] G. Golub and C. Van Loan. Matrix Computations. The Johns Hopkins University Press, 3rd edition, 1996. [9] I.N. Kozin and M. J. Deegan. A Study of the Performance of LAPACK Symmetric Matrix Diagonalisers on Multicore-core Architectures. Technical Report DL-TR-2007-005, Science and Technology Facilities Council, November 2007. [10] F. Mueller. Pthreads library interface, 1999. [11] TBB. Threading Building Blocks. Disponível em: www.threadingbuildingblocks.org. [12] F. Tisseury and J. Dongarra. Lapack Working Note 132: Parallelizing the divide and conquer algorithm for the symmetric tridiagonal eigenvalue problem on distributed memory architectures, February 1998.