Arquitetura do conjunto de instruções - Instruction set architecture

Em ciência da computação , uma arquitetura de conjunto de instruções ( ISA ), também chamada de arquitetura de computador , é um modelo abstrato de um computador . Um dispositivo que executa as instruções descritas por aquele ISA, como uma unidade de processamento central (CPU), é chamado de implementação .

Em geral, um ISA define as instruções com suporte , tipos de dados , registros , o suporte de hardware para gerenciar a memória principal , recursos fundamentais (como a consistência da memória , modos de endereçamento , memória virtual ) e o modelo de entrada / saída de uma família de implementações do ISA.

Um ISA especifica o comportamento do código de máquina em execução nas implementações desse ISA de uma forma que não depende das características dessa implementação, fornecendo compatibilidade binária entre as implementações. Isso permite várias implementações de um ISA que diferem em características como desempenho , tamanho físico e custo monetário (entre outras coisas), mas que são capazes de executar o mesmo código de máquina, de modo que uma máquina de baixo desempenho e custo mais baixo pode ser substituída por uma máquina de alto custo e desempenho sem a necessidade de substituir o software. Ele também permite a evolução das microarquiteturas das implementações daquele ISA, de modo que uma implementação mais recente e de alto desempenho de um ISA possa executar um software executado em gerações anteriores de implementações.

Se um sistema operacional mantiver uma interface binária de aplicativo (ABI) padrão e compatível para um ISA específico, o código de máquina será executado em futuras implementações desse ISA e do sistema operacional. No entanto, se um ISA oferecer suporte à execução de vários sistemas operacionais, isso não garante que o código de máquina de um sistema operacional será executado em outro sistema operacional, a menos que o primeiro sistema operacional ofereça suporte à execução de código de máquina criado para o outro sistema operacional.

Um ISA pode ser estendido adicionando instruções ou outros recursos, ou adicionando suporte para endereços maiores e valores de dados; uma implementação do ISA estendido ainda será capaz de executar código de máquina para versões do ISA sem essas extensões. O código de máquina que usa essas extensões só será executado em implementações que oferecem suporte a essas extensões.

A compatibilidade binária que eles fornecem torna as ISAs uma das abstrações mais fundamentais da computação .

Visão geral

Uma arquitetura de conjunto de instruções é distinta de uma microarquitetura , que é o conjunto de técnicas de projeto de processador usadas, em um processador específico, para implementar o conjunto de instruções. Processadores com diferentes microarquiteturas podem compartilhar um conjunto de instruções comum. Por exemplo, o Intel Pentium e o Advanced Micro Devices Athlon implementam versões quase idênticas do conjunto de instruções x86 , mas têm designs internos radicalmente diferentes.

O conceito de arquitetura , distinto do projeto de uma máquina específica, foi desenvolvido por Fred Brooks na IBM durante a fase de projeto do System / 360 .

Antes do NPL [System / 360], os projetistas de computadores da empresa eram livres para honrar os objetivos de custo não apenas selecionando tecnologias, mas também elaborando refinamentos funcionais e arquitetônicos. O objetivo de compatibilidade SPREAD, em contraste, postulou uma arquitetura única para uma série de cinco processadores abrangendo uma ampla gama de custos e desempenho. Nenhuma das cinco equipes de projeto de engenharia poderia contar com a possibilidade de realizar ajustes nas especificações arquitetônicas como forma de amenizar as dificuldades em atingir os objetivos de custo e desempenho.

Algumas máquinas virtuais que suportam bytecode como seu ISA, como Smalltalk , a máquina virtual Java e o Common Language Runtime da Microsoft , implementam isso traduzindo o bytecode para caminhos de código comumente usados ​​em código de máquina nativo. Além disso, essas máquinas virtuais executam caminhos de código usados ​​com menos frequência por interpretação (consulte: Compilação Just-in-time ). Transmeta implementou o conjunto de instruções x86 em processadores VLIW desta maneira.

Classificação de ISAs

Uma ISA pode ser classificada de várias maneiras diferentes. Uma classificação comum é por complexidade arquitetônica . Um computador com conjunto de instruções complexas (CISC) tem muitas instruções especializadas, algumas das quais podem ser raramente usadas em programas práticos. Um computador de conjunto de instruções reduzido (RISC) simplifica o processador implementando de forma eficiente apenas as instruções que são frequentemente usadas em programas, enquanto as operações menos comuns são implementadas como sub-rotinas, tendo seu tempo de execução de processador adicional resultante compensado por uso infrequente.

Outros tipos incluem arquiteturas de palavra de instrução muito longa (VLIW) e arquiteturas de palavra de instrução longa intimamente relacionadas (LIW) e de computação de instrução explicitamente paralela (EPIC). Essas arquiteturas buscam explorar o paralelismo em nível de instrução com menos hardware do que RISC e CISC, tornando o compilador responsável pela emissão e programação de instruções.

Arquiteturas com ainda menos complexidade foram estudadas, como o computador com conjunto mínimo de instruções (MISC) e um computador com conjunto de instruções (OISC). Esses são tipos teoricamente importantes, mas não foram comercializados.

Instruções

A linguagem de máquina é construída a partir de instruções ou instruções discretas . Na arquitetura de processamento, uma determinada instrução pode especificar:

  • opcode (a instrução a ser executada), por exemplo, adicionar, copiar, testar
  • quaisquer operandos explícitos:
registra
valores literais / constantes
modos de endereçamento usados ​​para acessar a memória

Operações mais complexas são construídas combinando essas instruções simples, que são executadas sequencialmente ou de outra forma direcionadas por instruções de fluxo de controle .

Tipos de instrução

Exemplos de operações comuns a muitos conjuntos de instruções incluem:

Manuseio de dados e operações de memória

  • Defina um registro com um valor constante fixo.
  • Copie dados de um local da memória ou um registro para um local da memória ou um registro (uma instrução de máquina é freqüentemente chamada de movimento ; no entanto, o termo é enganoso). Usado para armazenar o conteúdo de um registro, o resultado de um cálculo ou para recuperar dados armazenados para realizar um cálculo posterior. Frequentemente chamadas de operações de carregamento e armazenamento .
  • Leia e grave dados de dispositivos de hardware.

Operações aritméticas e lógicas

  • Adicione , subtraia , multiplique ou divida os valores de dois registradores, colocando o resultado em um registrador, possivelmente configurando um ou mais códigos de condição em um registrador de status .
    • incremento ,decremento em alguns ISAs, salvando a busca de operando em casos triviais.
  • Realize operações bit a bit , por exemplo, pegando a conjunção e disjunção de bits correspondentes em um par de registradores, pegando a negação de cada bit em um registrador.
  • Compare dois valores em registradores (por exemplo, para ver se um é menor ou se eles são iguais).
  • Instruções de ponto flutuante spara aritmética em números de ponto flutuante.

Operações de fluxo de controle

  • Desvie para outro local no programa e execute as instruções lá.
  • Desviar condicionalmente para outro local se uma determinada condição for mantida.
  • Ramifique indiretamente para outro local.
  • Chame outro bloco de código, enquanto salva a localização da próxima instrução como um ponto para o qual retornar.

Instruções do coprocessador

  • Carregar / armazenar dados de e para um coprocessador ou trocar com registradores de CPU.
  • Execute operações de coprocessador.

Instruções complexas

Os processadores podem incluir instruções "complexas" em seu conjunto de instruções. Uma única instrução "complexa" faz algo que pode exigir muitas instruções em outros computadores. Essas instruções são tipificadas por instruções que executam várias etapas, controlam várias unidades funcionais ou, de outra forma, aparecem em uma escala maior do que a maioria das instruções simples implementadas pelo processador fornecido. Alguns exemplos de instruções "complexas" incluem:

Instruções complexas são mais comuns em conjuntos de instruções CISC do que em conjuntos de instruções RISC, mas os conjuntos de instruções RISC também podem incluí-los. Os conjuntos de instruções RISC geralmente não incluem operações ALU com operandos de memória ou instruções para mover grandes blocos de memória, mas a maioria dos conjuntos de instruções RISC incluem instruções SIMD ou vetoriais que executam a mesma operação aritmética em vários pedaços de dados ao mesmo tempo. As instruções SIMD têm a capacidade de manipular grandes vetores e matrizes em um tempo mínimo. As instruções SIMD permitem fácil paralelização de algoritmos comumente envolvidos no processamento de som, imagem e vídeo. Várias implementações SIMD foram trazidas ao mercado sob nomes comerciais como MMX , 3DNow! e AltiVec .

Codificação de instrução

Uma instrução pode ter vários campos, que identificam a operação lógica, e também pode incluir endereços de origem e destino e valores constantes. Esta é a instrução MIPS "Adicionar Imediato", que permite a seleção de registradores de origem e destino e inclusão de uma pequena constante.

Em arquiteturas tradicionais, uma instrução inclui um opcode que especifica a operação a ser executada, como adicionar conteúdo de memória para registrar - e zero ou mais especificadores de operando , que podem especificar registros , locais de memória ou dados literais. Os especificadores de operando podem ter modos de endereçamento que determinam seu significado ou podem estar em campos fixos. Em arquiteturas de palavras de instrução muito longas (VLIW), que incluem muitas arquiteturas de microcódigo , vários opcodes e operandos simultâneos são especificados em uma única instrução.

Alguns conjuntos de instruções exóticas não têm um campo opcode, como arquiteturas disparadas por transporte (TTA), apenas operando (s).

A máquina virtual Forth e outros conjuntos de instruções de " 0 operando " não possuem campos de especificador de operando, como algumas máquinas de pilha, incluindo NOSC.

As instruções condicionais geralmente têm um campo de predicado - alguns bits que codificam a condição específica para fazer com que uma operação seja executada, em vez de não ser executada. Por exemplo, uma instrução de desvio condicional transferirá o controle se a condição for verdadeira, de modo que a execução prossiga para uma parte diferente do programa, e não transferirá o controle se a condição for falsa, para que a execução continue sequencialmente. Alguns conjuntos de instruções também têm movimentos condicionais, para que o movimento seja executado e os dados armazenados no local de destino, se a condição for verdadeira, e não executada, e o local de destino não modificado, se a condição for falsa. Da mesma forma, o IBM z / Architecture tem uma instrução de armazenamento condicional. Alguns conjuntos de instruções incluem um campo de predicado em cada instrução; isso é chamado de predicação de ramo .

Número de operandos

Os conjuntos de instruções podem ser categorizados pelo número máximo de operandos explicitamente especificados nas instruções.

(Nos exemplos a seguir, a , b e c são endereços (diretos ou calculados) que se referem a células de memória, enquanto reg1 e assim por diante se referem a registros de máquina.)

C = A+B
  • 0-operando ( máquinas de endereço de zero ), assim chamadas máquinas de pilha : Todas as operações aritméticas decorrer nos um top ou duas posições na pilha: push a, push b, add, pop c.
    • C = A+Bprecisa de quatro instruções . Para máquinas de pilha, os termos "operando 0" e "endereço zero" se aplicam a instruções aritméticas, mas não a todas as instruções, pois as instruções push e pop de 1 operando são usadas para acessar a memória.
  • 1 operando ( máquinas de um endereço ), as chamadas máquinas acumuladoras , incluem os primeiros computadores e muitos pequenos microcontroladores : a maioria das instruções especifica um único operando direito (ou seja, constante, um registro ou uma localização de memória), com o acumulador implícito como o operando da esquerda (e o destino se houver): load a, add b, store c.
    • C = A+Bprecisa de três instruções .
  • 2 operandos - muitas máquinas CISC e RISC se enquadram nesta categoria:
    • CISC - move Apara C ; em seguida, add Ba C .
      • C = A+Bprecisa de duas instruções . Isso efetivamente 'armazena' o resultado sem uma instrução de armazenamento explícita .
    • CISC - Muitas vezes as máquinas são limitados a um operando de memória por instrução: load a,reg1; add b,reg1; store reg1,c; Isso requer um par de carga / loja para qualquer movimento de memória, independentemente do addresultado é um aumento armazenado para um lugar diferente, como em C = A+B, ou a mesma posição de memória: A = A+B.
      • C = A+Bprecisa de três instruções .
    • RISC - Requerendo carregamentos de memória explícita, as instruções seriam load a,reg1:; load b,reg2; add reg1,reg2; store reg2,c.
      • C = A+Bprecisa de quatro instruções .
  • 3 operando, permitindo melhor reutilização dos dados:
    • CISC - Torna-se uma única instrução: add a,b,c
      • C = A+Bprecisa de uma instrução .
    • CISC - Ou, em máquinas limitadas a dois operandos de memória por instrução move a,reg1; add reg1,b,c;
      • C = A+Bprecisa de duas instruções .
    • RISC - instruções aritméticas usam registradores apenas, então instruções explícitas de carregamento / armazenamento de 2 operandos são necessárias load a,reg1:; load b,reg2; add reg1+reg2->reg3; store reg3,c;
      • C = A+Bprecisa de quatro instruções .
      • Ao contrário de 2 operandos ou 1 operando, isso deixa todos os três valores a, b e c em registros disponíveis para reutilização posterior.
  • mais operandos - algumas máquinas CISC permitem uma variedade de modos de endereçamento que permitem mais de 3 operandos (registros ou acessos à memória), como a instrução de avaliação polinomial VAX "POLY".

Devido ao grande número de bits necessários para codificar os três registradores de uma instrução de 3 operandos, as arquiteturas RISC que têm instruções de 16 bits são invariavelmente designs de 2 operandos, como o Atmel AVR, TI MSP430 e algumas versões do ARM Thumb . As arquiteturas RISC que têm instruções de 32 bits são geralmente designs de 3 operandos, como as arquiteturas ARM , AVR32 , MIPS , Power ISA e SPARC .

Cada instrução especifica um número de operandos (registradores, locais de memória ou valores imediatos) explicitamente . Algumas instruções fornecem um ou ambos os operandos implicitamente, como por serem armazenados no topo da pilha ou em um registro implícito. Se alguns dos operandos são fornecidos implicitamente, menos operandos precisam ser especificados na instrução. Quando um "operando de destino" especifica explicitamente o destino, um operando adicional deve ser fornecido. Conseqüentemente, o número de operandos codificados em uma instrução pode diferir do número matematicamente necessário de argumentos para uma operação lógica ou aritmética (a aridade ). Os operandos são codificados na representação "opcode" da instrução ou são fornecidos como valores ou endereços após o opcode.

Registrar pressão

A pressão de registro mede a disponibilidade de registros livres a qualquer momento durante a execução do programa. A pressão do registro é alta quando um grande número de registros disponíveis está em uso; Assim, quanto maior a pressão registo, quanto mais vezes o conteúdo do registro deve ser derramado na memória. Aumentar o número de registros em uma arquitetura diminui a pressão do registro, mas aumenta o custo.

Embora os conjuntos de instruções embutidos, como Thumb, sofram de pressão de registro extremamente alta porque têm pequenos conjuntos de registros, RISC ISAs de uso geral, como MIPS e Alpha, desfrutam de baixa pressão de registro. Os ISAs da CISC, como o x86-64, oferecem baixa pressão de registro, apesar de terem conjuntos de registros menores. Isso se deve aos muitos modos e otimizações de endereçamento (como endereçamento de sub-registro, operandos de memória em instruções ALU, endereçamento absoluto, endereçamento relativo ao PC e vazamentos de registro para registro) que os ISAs da CISC oferecem.

Comprimento da instrução

O tamanho ou comprimento de uma instrução varia amplamente, de apenas quatro bits em alguns microcontroladores a muitas centenas de bits em alguns sistemas VLIW . Os processadores usados ​​em computadores pessoais , mainframes e supercomputadores têm tamanhos de instrução entre 8 e 64 bits. A instrução mais longa possível em x86 é de 15 bytes (120 bits). Dentro de um conjunto de instruções, instruções diferentes podem ter comprimentos diferentes. Em algumas arquiteturas, notavelmente a maioria dos computadores com conjunto de instruções reduzido (RISC),as instruções têm um comprimento fixo , geralmente correspondendo ao tamanho de palavra dessa arquitetura. Em outras arquiteturas, as instruções têm comprimento variável, normalmente múltiplos inteiros de um byte ou meia palavra . Alguns, como o ARM com extensão Thumb têmcodificação variável mista , ou seja, duas codificações fixas, geralmente de 32 bits e 16 bits, onde as instruções não podem ser misturadas livremente, mas devem ser alternadas em uma ramificação (ou limite de exceção em ARMv8 )

Um conjunto de instruções RISC normalmente tem um comprimento de instrução fixo (geralmente 4 bytes = 32 bits), enquanto um conjunto de instruções CISC típico pode ter instruções de comprimento amplamente variável (1 a 15 bytes para x86). Instruções de comprimento fixo são menos complicadas de manipular do que instruções de comprimento variável por vários motivos (não ter que verificar se uma instrução se estende por uma linha de cache ou limite de página de memória virtual, por exemplo) e, portanto, são um pouco mais fáceis de otimizar para velocidade.

Densidade de código

Nos computadores do início da década de 1960, a memória principal era cara e muito limitada, mesmo em mainframes. Minimizar o tamanho de um programa para ter certeza de que ele caberia na memória limitada costumava ser fundamental. Portanto, o tamanho combinado de todas as instruções necessárias para executar uma tarefa específica, a densidade do código , era uma característica importante de qualquer conjunto de instruções. Ele permaneceu importante nas memórias inicialmente minúsculas dos minicomputadores e depois dos microprocessadores. A densidade continua importante hoje, para aplicativos de smartphone, aplicativos baixados para navegadores em conexões lentas de Internet e em ROMs para aplicativos incorporados. Uma vantagem mais geral do aumento da densidade é a eficácia aprimorada dos caches e da pré-busca de instruções.

Computadores com alta densidade de código geralmente têm instruções complexas para entrada de procedimento, retornos parametrizados, loops, etc. (portanto, retroativamente denominados Complex Instruction Set Computers , CISC ). No entanto, as instruções "CISC" mais típicas ou frequentes simplesmente combinam uma operação ALU básica, como "adicionar", com o acesso de um ou mais operandos na memória (usando modos de endereçamento como direto, indireto, indexado, etc.) . Certas arquiteturas podem permitir dois ou três operandos (incluindo o resultado) diretamente na memória ou podem executar funções como incremento automático de ponteiro, etc. Os conjuntos de instruções implementados por software podem ter instruções ainda mais complexas e poderosas.

Computadores com conjuntos de instruções reduzidos , RISC , foram amplamente implementados pela primeira vez durante um período de subsistemas de memória de rápido crescimento. Eles sacrificam a densidade do código para simplificar os circuitos de implementação e tentam aumentar o desempenho por meio de frequências de clock mais altas e mais registradores. Uma única instrução RISC normalmente executa apenas uma única operação, como uma "adição" de registradores ou uma "carga" de um local da memória para um registrador. Um conjunto de instruções RISC normalmente tem um comprimento de instrução fixo , enquanto um conjunto de instruções CISC típico tem instruções de comprimento amplamente variável. No entanto, como os computadores RISC normalmente requerem mais e frequentemente instruções mais longas para implementar uma determinada tarefa, eles fazem um uso menos otimizado da largura de banda do barramento e das memórias cache.

Certos ISAs RISC incorporados, como Thumb e AVR32, normalmente exibem densidade muito alta devido a uma técnica chamada compactação de código. Essa técnica compacta duas instruções de 16 bits em uma palavra de 32 bits, que é então descompactada no estágio de decodificação e executada como duas instruções.

Os computadores com conjunto mínimo de instruções (MISC) são uma forma de máquina de pilha , onde existem algumas instruções separadas (16-64), de modo que várias instruções podem ser encaixadas em uma única palavra de máquina. Esses tipos de núcleos geralmente requerem pouco silício para serem implementados, portanto, podem ser facilmente realizados em um FPGA ou em uma forma de vários núcleos . A densidade do código do MISC é semelhante à densidade do código do RISC; a densidade de instrução aumentada é compensada por exigir mais das instruções primitivas para fazer uma tarefa.

Tem havido pesquisas sobre compactação de executáveis como um mecanismo para melhorar a densidade do código. A matemática da complexidade de Kolmogorov descreve os desafios e limites disso.

Representação

As instruções que constituem um programa raramente são especificadas usando sua forma numérica interna ( código de máquina ); eles podem ser especificados por programadores usando uma linguagem assembly ou, mais comumente, podem ser gerados a partir de linguagens de programação de alto nível por compiladores .

Projeto

O design de conjuntos de instruções é uma questão complexa. Houve duas etapas na história do microprocessador. O primeiro foi o CISC (Complex Instruction Set Computer), que tinha muitas instruções diferentes. Na década de 1970, no entanto, lugares como a IBM fizeram pesquisas e descobriram que muitas instruções do conjunto podiam ser eliminadas. O resultado foi o RISC (Reduced Instruction Set Computer), uma arquitetura que utiliza um conjunto menor de instruções. Um conjunto de instruções mais simples pode oferecer o potencial para velocidades mais altas, tamanho reduzido do processador e consumo de energia reduzido. No entanto, um conjunto mais complexo pode otimizar operações comuns, melhorar a eficiência da memória e do cache ou simplificar a programação.

Alguns designers de conjunto de instruções reservam um ou mais opcodes para algum tipo de chamada de sistema ou interrupção de software . Por exemplo, MOS Technology 6502 usos 00 H , Zilog Z80 utiliza os oito códigos C7, CF, D7, DF, E7, EF, F7, FF H enquanto Motorola 68000 uso códigos na gama A000..AFFF H .

As máquinas virtuais rápidas são muito mais fáceis de implementar se um conjunto de instruções atender aos requisitos de virtualização Popek e Goldberg .

O slide NOP usado na programação com reconhecimento de imunidade é muito mais fácil de implementar se o estado "não programado" da memória for interpretado como um NOP .

Em sistemas com vários processadores, algoritmos de sincronização sem bloqueio são muito mais fáceis de implementar se o conjunto de instruções incluir suporte para algo como " buscar e adicionar ", " carregar link / armazenar condicional " (LL / SC) ou " comparação e troca atômica ".

Implementação do conjunto de instruções

Qualquer conjunto de instruções pode ser implementado de várias maneiras. Todas as maneiras de implementar um determinado conjunto de instruções fornecem o mesmo modelo de programação e todas as implementações desse conjunto de instruções são capazes de executar os mesmos executáveis. As várias maneiras de implementar um conjunto de instruções oferecem diferentes compensações entre custo, desempenho, consumo de energia, tamanho, etc.

Ao projetar a microarquitetura de um processador, os engenheiros usam blocos de circuitos eletrônicos "hard-wired" (muitas vezes projetados separadamente), como somadores, multiplexadores, contadores, registradores, ALUs, etc. Algum tipo de linguagem de transferência de registradores é frequentemente usada para descrever a decodificação e sequenciamento de cada instrução de um ISA usando esta microarquitetura física. Existem duas maneiras básicas de construir uma unidade de controle para implementar esta descrição (embora muitos projetos usem meios-meios ou compromissos):

  1. Alguns projetos de computador "conectam" a decodificação e sequenciamento do conjunto de instruções completo (assim como o resto da microarquitetura).
  2. Outros projetos empregam rotinas ou tabelas de microcódigo (ou ambos) para fazer isso - normalmente como ROMs ou PLAs no chip ou ambos (embora RAMs e ROMs separados tenham sido usados ​​historicamente). O Western Digital MCP-1600 é um exemplo mais antigo, usando uma ROM separada e dedicada para microcódigo.

Alguns projetos usam uma combinação de projeto com fio e microcódigo para a unidade de controle.

Alguns designs de CPU usam um armazenamento de controle gravável - eles compilam o conjunto de instruções em uma RAM gravável ou flash dentro da CPU (como o processador Rekursiv e o Imsys Cjip ) ou um FPGA ( computação reconfigurável ).

Um ISA também pode ser emulado no software por um intérprete . Naturalmente, devido à sobrecarga de interpretação, isso é mais lento do que a execução direta de programas no hardware emulado, a menos que o hardware que executa o emulador seja uma ordem de magnitude mais rápido. Hoje, é uma prática comum para fornecedores de novos ISAs ou microarquiteturas disponibilizar emuladores de software para desenvolvedores de software antes que a implementação do hardware esteja pronta.

Freqüentemente, os detalhes da implementação têm uma forte influência nas instruções específicas selecionadas para o conjunto de instruções. Por exemplo, muitas implementações do pipeline de instruções permitem apenas uma única carga de memória ou armazenamento de memória por instrução, levando a uma arquitetura de armazenamento de carga (RISC). Para outro exemplo, algumas das primeiras maneiras de implementar o pipeline de instruções levaram a um slot de atraso .

As demandas de processamento de sinal digital de alta velocidade empurraram na direção oposta - forçando as instruções a serem implementadas de uma maneira particular. Por exemplo, para executar filtros digitais rápido o suficiente, a instrução MAC em um processador de sinal digital típico (DSP) deve usar um tipo de arquitetura Harvard que pode buscar uma instrução e duas palavras de dados simultaneamente, e requer um ciclo único de multiplicação-acumulação multiplicador .

Veja também

Referências

Leitura adicional

links externos