De acordo com previsões do roadmap ITRS (ITRS, 2010), serão necessários processadores com desempenho mais que 300 vezes maior na próxima década para que seja mantida a estimativa de desenvolvimento de processadores. Entretanto, o limite físico dos computadores sequenciais está sendo alcançado, dessa forma a computação paralela surge como uma alternativa para superar três limites: power wall, o aumento do desempenho do processador está limitado pela capacidade de dissipação de calor e energia; memory wall, o desempenho dos programas está limitado a eficiência na comunicação entre o processador e a memória; e a frequency wall, a frequência do cristal oscilador que determina a capacidade de processamento do processador em ciclos (SACCA, KOYAMA et al., 2007). Assim, além das arquiteturas paralelas, os modelos de programação paralela são
propostos para introduzir abstração aos detalhes do hardware levando em consideração o modelo de memória: compartilhada ou distribuída.
Um modelo de programação paralela é definido por (GOLDMAN, MATSUBARA et al., 2010) como uma máquina de abstração com uma interface responsável por separar propriedades de alto- nível das de baixo-nível, oferecendo operações para programação paralela. Esse modelo deve distinguir o desenvolvimento do software da execução paralela efetiva e fornece ao desenvolvedor tanto abstração, simplificando a estrutura do software, quanto estabilidade, supondo uma interface padrão na construção do software independente dos detalhes da arquitetura do hardware paralelo. Um modelo de programação também reproduz restrições de máquinas concretas, tentando garantir a máxima aplicabilidade em máquinas existentes e em futuras, além de fazer estimativas do desempenho e do custo do programa (HAMBRUSCH, 1996).
(SKILLICORN e TALIA, 1998) e (GOLDMAN, MATSUBARA et al., 2010) propõem uma classificação dos modelos de programação paralela de acordo com o nível de abstração e detalhamento.
A primeira classe de modelo é ha ada de ada e plí ito uma vez que as decisões sobre o paralelismo não são realizadas pelo programador, entretanto, tanta abstração também introduz dificuldades na programação devido à quantidade de inferências. A automatização deve ser feita desde a divisão do programa em partes, passando pelo mapeamento das partes nos processadores e escalonamento, até a sincronização. Existem várias abordagens usando este modelo, mesmo sendo muito abstrato e muito custoso. Entre as abordagens tem-se: programação funcional de ordem superior, baseada na avaliação de programas como funções matemáticas as quais formam um sistema; interleaving, que consiste em organizar os dados de maneira não contígua; linguagens de lógica paralela implícita, que consiste na divisão do programa em sentenças lógicas relacionadas através de E e OU lógico; skeletons algorítmicos e homomóficos, que entende os programa como blocos prontos, ou seja, componentes fundamentais estão pré-definidos (skeletons), que quando são estruturas de dados são chamado de skeletons homomórficos; linguagens de processamento celular, são baseadas na execução de um autômato celular, o qual corresponde a uma distribuição n- dimensional de células que estão conectadas a um conjunto finito de células adjacentes.
A segunda classe o pa alelis o e plí ito , as o p og a ado o p e isa e pli ita o o os cálculos computacionais serão divididos nem como essas partes serão mapeadas entre os processadores nem como a comunicação e sincronização entre eles é realizada. Exemplos desse modelo são: dataflow, onde os programas são representados como operações, geralmente pequenas, que possuem entradas e saídas explícitas, as quais determinam a ordem de execução das operações ou inferem concorrência quando não há dependência; linguagens lógicas explícitas, também chamadas de linguagens lógicas concorrentes, e podem ser vistas como uma nova
interpretação da cláusula de Horn; estrutura estática consiste no paralelismo na aplicação de operações monolíticas em objetos de uma estrutura de dados.
A terceira classe a de o posiç o e plí ita ue to a e plí ito o pa alelis o e a decomposição, isto é, o programador é responsável por quebrar o programa em partes, mas mantém implícito o mapeamento, comunicação e sincronismo. Os principais representantes dessa classe são: BSP (Bulk Synchronous Parallelism) que captura as propriedades da rede de interconexão do modelo através de alguns parâmetros da arquitetura determinados experimentalmente para cada computador paralelo; LogP, utiliza quatro parâmetros: latência (L), overhead (o), largura da faixa de comunicação (g – gap) e o número de processadores (P), para criar contextos locais dos programas (threads) atualizadas através de uma comunicação global.
Na quarta classe de modelos (mapeamento explícito) são necessários comandos no código para dividir o programa e definir onde cada parte será executada, entretanto a comunicação e o sincronismo permanecem implícitos. Como a localidade de cada parte do programa tem impacto direto no desempenho, a rede de interconexão entre os elementos de processamento deve ser bem clara para o programador. Nessa classe tem-se: linguagens de coordenação que simplificam e estabelecem um padrão próprio para comunicação, separando os aspectos computacionais dos aspectos comunicativos, tais como a linguagem Linda (SKILLICORN e TALIA, 1998) que substitui as comunicações ponto-a-ponto entre os processos por um grande repositório compartilhado; linguagens de comunicação sem mensagem reduzem a carga de gerenciamento de comunicação simulando esta comunicação para se ajustarem mais naturalmente a threads, como as linguagens ALMS, PCN (Program Composition Notation) e Compositional C++; linguagens funcionais com notação disponibilizam mecanismos para os programadores informarem como particionar o programa e como mapeá-las, facilitando o trabalho do compilador, como por exemplo as linguagens Paralf, DP, Cedar e Concorrent CLU; linguagens de coordenação com contexto, estendem a ideia de Linda, permitindo múltiplos espaços de tuplas, denominado contextos, e podem ser visíveis por apenas algumas threads, por exemplo as linguagens Ease e ISETL-Linda; skeleton de comunicação estendem a ideia de blocos pré-estruturados para a comunicação, que neste caso é uma união de computações local independentes, com níveis de comunicação, constituída de padrões fixos em uma topologia abstrata.
A ui ta lasse a o u i aç o e plí ita ue a t ape as o si o is o i plí ito, ou seja, é responsabilidade do programador cuidar do paralelismo, decomposição, mapeamento e comunicação. Exemplos dessa classe são: Actors, baseia-se na coleção de objetos, chamados de atores, que são as primitivas universais da computação paralela, os quais possuem uma fila de mensagens para ler uma mensagem, enviar mensagens para outros atores, tomar decisões locais ou criar um número finito de outros atores; ActorSpace, estende a ideia dos atores para eliminar o
gargalo provocado pelo fila de mensagens sequenciais, evitando serializações desnecessárias através de padrões de destino; Concorrent Aggregates também estendem a ideia dos atores através do paradigma de Orientação a Objetos para o contexto de computação paralela, introduzindo objetos concorrentes, chamada de métodos concorrentemente e agregados (coleção de objetos distribuídos); array sistólicos é composto por uma matriz de unidades de processamento de dados, ou células, formando uma grade, na qual cada célula compartilha a informação com suas vizinhas após o seu processamento.
A se ta e últi a lasse a tudo e plí ito , o de o p og a ado de e se p eo upa o todas as etapas desde o paralelismo até o sincronismo, e, portanto os detalhes da arquitetura são extremamente necessários. Representantes dessa classe são: passagem de mensagem (message passing), memória compartilhada (shared memory), rendezvouz e data parallel. O mecanismo de passagem de mensagem deve oferecer operações de envio (send) e recebimento (receive) de identificação de processos, de endereços e da mensagem propriamente dita. Esse modelo funciona de maneira muito eficiente em sistemas que utilizam memória distribuída (GOLDMAN, MATSUBARA et al., 2010). Um exemplo de passagem de mensagem é o MPI (Message Passing Inteface) que é uma ferramenta que é suportada por muitas linguagens de programação e várias arquiteturas. A linguagem CML (Concurrent ML), proposta por (REPPY e XIAO, 2007), é uma linguagem concorrente estaticamente tipada com suporte a operações síncronas de primeira classe, estendendo o padrão ML. Segundo o autor, o mecanismo adotado na CML permite os programadores encapsularem comunicações e protocolos de sincronização complicados, como abstrações de primeira classe, estimulando a programação no estilo modular. No paradigma de memória compartilhada, são utilizadas variáveis comuns a vários processos, de forma que é necessário algum mecanismo de arbitragem para uso não simultâneo da mesma variável por mais de um processo. No paradigma rendezvouz são usadas operações de requisição (entry) de um processo para outro que deve aceitar a requisição (accept), caso contrário o processo requisitante fica suspenso a espera da aceitação. Esse tipo de modelo é utilizado em sistema com memória distribuída para os processos executarem suas regiões críticas com exclusão mútua, como nas linguagens Ada e Concurrent C. Por fim, o modelo data parallel é utilizado em aplicações numéricas científicas distribuindo vetores por múltiplos processadores através da relevância dos cálculos para cada processador. Uma linguagem que se utiliza desse paradigma é a HPF (High Performance Fortran), mas também pode ser implementa através de MPI. Em (GRELCK e SCHOLZ, 2007), é discutido o suporte da linguagem funcional data parallel SaC (Single Assignment C) e seu compilador para arquiteturas multicore, com o objetivo de combinar programação declarativa de vetores de alto nível com performance em tempo de execução competindo com soluções imperativas.
Em (YUN JIE, HOUZET et al., 2010), é proposta uma metodologia de desenvolvimento de uma arquitetura baseada em NoC e seu modelo de programação direcionado para aplicações de streaming como processamento de áudio e vídeo para reduzir o gap semântico entre aplicação e implementação. Nessa metodologia, a topologia da NoC é descrita como uma matriz de roteadores formando uma hierarquia. Além disso, a NoC foi desenvolvida em conjunto com um modelo de programação de streaming expressa com um subconjunto de SystemC (OSCI, 2005). Isto permite otimizar a NoC através da implementação das primitivas de comunicação e sincronização do modelo de programação diretamente no hardware.
Capí tulo
ARQUITETURA IPNOSYS
A arquitetura proposta como objeto de estudo e experimentos desta tese é apresentada neste capítulo, começando pelas características inspiradas nas redes em chip, apresentando os formatos dos pacotes utilizados, seguido pelo modelo de computação adotado, passando pela proposta de algoritmo de roteamento que garante a execução de todas as instruções presentes nos pacotes, seguido pela solução preventiva para situações de deadlock. Por fim são apresentados os detalhes da estrutura interna dos componentes da arquitetura (RPU, MAU e E/S).