• Nenhum resultado encontrado

Caso II: Necessidade de um controlador simples Este caso ocorre em três situações: II.1) Quando o número de unidades lógico-aritméticas é menor do que o número

3.4. ARQUITETURAS PARA PROCESSAMENTO PARALELO

3.4.1. MÁQUINAS SIMD

Máquinas SIMD (Single Instruction Stream, Multiple Data Stream) possuem um grande número de unidades de processamento, denominadas PE (Processing Element), que executam uma mesma instrução sobre diferentes fluxos de dados. Nesta categoria, estão inclusos os chamados processadores matriciais. A figura 3.6 mostra a arquitetura básica de uma máquina SIMD.

Figura 3.6. Arquitetura básica de uma máquina SIMD.

UC ==> Unidade de Controle PE ==> Processing Element

(Elemento de Processamento) SM ==> Sistema de Memória

ML ==> Memória Local de cada PE FI ==> Fluxo de Instruções FD ==> Fluxo de Dados FI FI UP0 FD0 UPn FDn UP1 FD1 UC ML0 MLn ML1 SM

De acordo com o sistema de memória, máquinas SIMD podem ser subdivididas em duas categorias, quais sejam, SM-SIMD (Shared-Memory SIMD) e DM-SIMD (Distributed

Memory SIMD).

3.4.1.1. MÁQUINAS SM-SIMD

O principal representante desta classe é a máquina vetorial uniprocessadora (figura 3.7), embora existam outros modelos conhecidos, como, por exemplo, as máquinas VLIW (Very Long Instruction Word Computer) [17]. Máquinas vetoriais multiprocessadoras são enquadradas na categoria de máquinas MIMD de memória compartilhada (SM-MIMD), a qual encontra-se descrita na seção 3.4.3.1. Nas considerações da presente seção, é utilizado o termo máquina vetorial, sem distinção entre uniprocessadora e multiprocessadora. A diferença básica entre ambas é que nas máquinas vetoriais multiprocessadoras existe mais de um processador vetorial (aqui chamado VPU, de Vector Processing Unit).

Figura 3.7. Arquitetura de uma máquina vetorial com 1 processador vetorial.

Máquinas vetoriais foram idealizadas no início da década de 70, com o objetivo de obter alto desempenho através da redução do ciclo de clock a valores mínimos. Naquela época, o ciclo de clock representava cerca de 10% do tempo gasto num acesso à memória ou numa operação aritmética, fazendo com que os projetistas implementassem unidades aritméticas e de memória com vários estágios de pipeline. Nas máquinas vetoriais, a memória

Memória "pipelinizada" Periféricos Processador de E/S IP/ULA Cache de Dados/Instr. VPU Registradores Vetoriais pipe 1 pipe 2 pipe n FPU Cache de Dados Registradores Escalares pipe 1 pipe 2 pipe m VPU ==> Vector Processing Unit

(processador vetorial) FPU ==> Scalar Floating-Point Unit

(processador de ponto flutuante) IP ==> Integer Processor

(proc. para números inteiros) pipe n ==> estágio n do pipeline

é decomposta em bancos com igual número de endereços, com acesso paralelo aos dados presentes no mesmo endereço de diferentes bancos (vetor de dados). Cada vetor de dados é transferido serialmente para/dos registradores vetoriais através do pipeline de memória. Operandos e resultados de instruções vetoriais são vetores, embora existam registradores e processadores escalares para operações escalares sobre números inteiros ou de ponto flutuante.

Máquinas vetoriais uniprocessadoras têm somente um VPU, podendo o sistema ter sua capacidade escalar de ponto flutuante compartilhada com este processador (como ocorre nos sistemas Cray). Geralmente, VPUs não possuem cache, pois a velocidade de execução pode diminuir com a ocorrência de estouro (overflow) do mesmo [18].

Embora tenham existido VPUs que carregavam seus operandos diretamente da memória e armazenavam os resultados imediatamente de volta à mesma, todos os VPUs de hoje usam registradores vetoriais. Estes não prejudicam a velocidade das operações, fornecendo maior flexibilidade na junção de operandos e na manipulação de resultados intermediários.

Na figura 3.7, detalhes de interconexão entre o VPU e a memória são omitidos. No entanto, esta interconexão é muito importante para a velocidade efetiva de uma operação vetorial: quando a largura da banda (bandwidth) entre a memória e o VPU é muito pequena, o VPU terá que esperar enquanto operações LOAD/STORE estiverem sendo executadas. Quando a razão (operações aritméticas) / (operações LOAD/STORE) não for alta o suficiente para compensar tais situações, fortes quedas de desempenho poderão ocorrer. Máquinas vetoriais podem ser muito rápidas, desde que exista um número suficiente de operações vetoriais no código. Como as aplicações nem sempre são escritas objetivando vetorização, é necessário que os compiladores se encarreguem da vetorização de um código comum, o que muitas vezes se limita à decomposição de loops em operações vetoriais. Além disso, o desempenho de máquinas vetoriais tende a degradar durante operações escalares e quando do acesso a posições não seqüenciais em matrizes.

3.4.1.2. MÁQUINAS DM-SIMD

Máquinas deste tipo são também conhecidas como processadores matriciais (processor-array systems). Estes processadores executam a mesma instrução ao mesmo tempo, sobre diferentes itens de dados. A não exigência de sincronização entre os processadores simplifica em muito o projeto de tais sistemas. Um processador de controle é responsável pelo envio das instruções que serão executadas pelos demais processadores do arranjo. As máquinas DM-SIMD atuais utilizam um processador front-end responsável pela interface com o usuário, o qual conecta-se ao processador de controle através de um datapath. A figura 3.8 [18] mostra o modelo genérico de uma máquina DM-SIMD. Esta figura poderia sugerir que todos os processadores estariam conectados em uma rede bidimensional. De fato, a topologia de interconexão destas máquinas sempre inclui redes bidimensionais. Entretanto, várias máquinas apresentam estruturas de interconexão mais complexas, com redes tridimensionais ou ligações diagonais.

Durante a execução de uma instrução, é possível que processadores do arranjo fiquem ociosos, o que acarretará em queda do desempenho. Outro fator prejudicial ao desempenho ocorre quando um processador i necessita de dados armazenados na memória de um

processador j. Este último terá que obter os dados (fetch) e enviá-los através da rede de roteamento ao processador i, o que poderá consumir bastante tempo. Por estes problemas, máquinas DM-SIMD devem ser empregadas em computações maciçamente paralelas como, por exemplo, aplicações para o processamento de imagens digitais.

Os processadores do arranjo muitas vezes são de tipos simples, operando bit a bit serialmente (bit-serial type), independentemente dos tipos dos itens de dados. Desta forma, operações sobre inteiros são produzidas por rotinas de software sobre estes processadores, o que consome um número variável de ciclos em conformidade com o tamanho dos operandos. Assim, um resultado inteiro de 32 bits será produzido duas vezes mais rápido do que um resultado inteiro de 64 bits. Situação similar ocorre com operações de ponto flutuante. Em alguns casos, coprocessadores de ponto flutuante são adicionados ao arranjo. A quantidade destes é, no entanto, de 8 a 16 vezes menor do que a de processadores do tipo bit-serial, devido ao aumento no custo. Uma vantagem apresentada por processadores bit-serial é que eles podem operar sobre operandos de qualquer tamanho. Esta característica é de grande valia durante a geração de números randômicos e no processamento de sinais, atividades nas quais operandos de 1 ou 8 bits são abundantes. Como o tempo de execução em processadores

bit-serial é proporcional ao tamanho dos operandos, isto resulta em ganhos significativos de

velocidade.

Processadores matriciais são fáceis de construir e de programar [3], desde que a estrutura natural do problema (aplicação) case-se com a topologia do arranjo. Assim, eles não podem ser considerados máquinas de propósito genérico, uma vez que nem todas as aplicações podem ser escritas facilmente para estas máquinas, a fim de explorar sua potencialidade.

Figura 3.8. Arquitetura genérica de uma máquina SIMD com memória distribuída.

Processador de Controle arranjo de processadores plano de registradores rede de interconexão plano de movimento de dados Memória Processador Front-End Processador E/S Processador Front-End