Palavra de instrução muito longa (em inglês: very long instruction word, comumente abreviado como VLIW) é um tipo de arquitetura de conjunto de instruções projetado para explorar o paralelismo em nível de instrução (ILP, do inglês instruction-level parallelism) ao especificar explicitamente, de forma prévia, quais instruções devem ser executadas em paralelo.
As arquiteturas VLIW contrastam com as arquiteturas superescalares, a abordagem predominante para explorar o ILP, na qual o hardware descobre e agenda dinamicamente a execução paralela em tempo de execução. A motivação primária do VLIW é obter maior desempenho sem a complexidade de hardware inerente aos projetos superescalares. Os circuitos necessários para analisar repetidamente fluxos de instruções e agendar a execução paralela em tempo de execução aumentam a área do chip, o custo e o consumo de energia, além de potencialmente reduzirem as frequências de clock.
A denominação VLIW deriva do formato de instrução presente em quase todas as suas implementações, no qual o compilador agrupa operações destinadas a serem executadas simultaneamente em uma única palavra de instrução ampla, despachada para as unidades de execução como uma única entidade. Essas palavras de instrução podem ser extremamente largas — algumas implementações chegaram a utilizar palavras de 1 kilobit ou mais. No entanto, isso é apenas uma consequência natural da forma de implementação do VLIW. A característica definidora do VLIW reside no fato de que a ordem exata de execução e o paralelismo são identificados e especificados previamente.
O VLIW transfere a tarefa de identificar o paralelismo do hardware para o compilador. Isso aumenta substancialmente a complexidade do compilador, que deve agendar as instruções garantindo a corretude da execução, resolvendo conflitos de recursos (unidades de execução, registradores e portas de memória) e explorando o maior paralelismo exposto pelo hardware mais simples do VLIW.
O conceito de arquitetura VLIW e o termo VLIW foram concebidos por Josh Fisher e seu grupo de pesquisa na Universidade Yale no início da década de 1980. Seu desenvolvimento original do escalonamento de traços (trace scheduling) como método de compilação para VLIW foi elaborado quando ele era estudante de pós-graduação na Universidade de Nova Iorque. Antes do VLIW, a noção de pré-agendamento de unidades de execução e paralelismo em nível de instrução em software já estava bem estabelecida na prática de desenvolvimento de microcódigo horizontal.
As inovações de Fisher envolveram o desenvolvimento de um compilador capaz de gerar microcódigo horizontal a partir de programas escritos em uma linguagem de programação convencional. Ele percebeu que, para obter bom desempenho e alimentar uma máquina de emissão ampla (wide-issue), seria necessário encontrar paralelismo além daquele contido em um único bloco básico. Ele também desenvolveu métodos de escalonamento de regiões para identificar paralelismo além dos blocos básicos. O escalonamento de traços é um desses métodos e consiste em agendar primeiramente o caminho mais provável dos blocos básicos, inserindo código compensatório para lidar com movimentações especulativas, agendando o segundo traço mais provável e assim por diante, até que o escalonamento esteja completo.
A segunda inovação de Fisher foi a noção de que a arquitetura da CPU de destino deveria ser projetada para ser um alvo adequado para o compilador; ou seja, que o compilador e a arquitetura para um processador VLIW deveriam ser codesenhados. Isso foi inspirado em parte pela dificuldade observada por Fisher em Yale ao compilar para arquiteturas como o FPS164 da Floating Point Systems, que possuía uma arquitetura CISC que separava o início da instrução das instruções que salvavam o resultado, exigindo algoritmos de escalonamento extremamente complexos. Fisher desenvolveu um conjunto de princípios que caracterizavam um projeto VLIW adequado, tais como pipelines autodrenantes, banco de registradores amplos com múltiplas portas e arquiteturas de memória específicas. Esses princípios facilitaram a geração de código rápido por parte dos compiladores.
O primeiro compilador VLIW foi descrito na tese de doutorado de John Ellis, orientada por Fisher. O compilador foi batizado de Bulldog, em homenagem ao mascote de Yale.
Fisher deixou Yale em 1984 para fundar uma startup, a Multiflow, juntamente com os cofundadores John O'Donnell e John Ruttenberg. A Multiflow produziu a série TRACE de minissupercomputadores VLIW, entregando suas primeiras máquinas em 1987. O processador VLIW da Multiflow conseguia emitir até 28 operações em paralelo por instrução. O sistema TRACE foi implementado utilizando uma combinação de integração em média escala (MSI), integração em grande escala (LSI) e integração em escala muito grande (VLSI), acondicionado em gabinetes industriais — uma tecnologia que se tornou obsoleta à medida que se tornou mais viável economicamente integrar todos os componentes de um processador (exceto a memória) em um único chip.
A Multiflow surgiu cedo demais para aproveitar a onda subsequente, quando as arquiteturas de chips começaram a permitir CPUs de emissão múltipla (multiple-issue). As principais empresas de semicondutores reconheceram o valor da tecnologia da Multiflow nesse contexto, de modo que o compilador e a arquitetura foram posteriormente licenciados para a maioria dessas corporações.
Um processador que executa cada instrução sequencialmente, uma após a outra (ou seja, uma arquitetura escalar não segmentada em pipeline), pode subutilizar os recursos do hardware, resultando em baixo desempenho. O desempenho pode ser aprimorado executando diferentes subetapas de instruções sequenciais simultaneamente (técnica denominada pipelining), ou até mesmo executando múltiplas instruções inteiramente em simultâneo, como nas arquiteturas superescalares. Melhorias adicionais podem ser obtidas executando instruções em uma ordem diferente daquela em que aparecem no programa, processo conhecido como execução fora de ordem.
Todos esses três métodos elevam a complexidade do hardware. Antes de executar quaisquer operações em paralelo, o processador precisa verificar se as instruções não possuem interdependências. Por exemplo, se o resultado de uma primeira instrução é utilizado como entrada de uma segunda instrução, elas não podem ser executadas ao mesmo tempo, e a segunda instrução não pode ser executada antes da primeira. Os processadores modernos com execução fora de ordem expandiram significativamente os recursos de hardware dedicados ao agendamento de instruções e à detecção de interdependências.
Em contrapartida, o VLIW executa operações em paralelo com base em um escalonamento fixo, determinado no momento em que os programas são compilados. Como a definição da ordem de execução das operações (incluindo quais operações podem ser executadas simultaneamente) fica a cargo do compilador, o processador não necessita do hardware de escalonamento exigido pelos três métodos descritos acima. Assim, as CPUs VLIW oferecem maior poder computacional com menor complexidade de hardware (embora com maior complexidade de compilação) do que a maioria das CPUs superescalares. Isso também complementa o princípio de que a maior quantidade possível de computação deve ser realizada antes da execução do programa, em tempo de compilação.
Nos projetos superescalares, a quantidade de unidades de execução é transparente (invisível) para o conjunto de instruções. Cada instrução codifica apenas uma única operação. Na maioria dos projetos superescalares, a largura da instrução é de 32 bits ou menos.
Em contrapartida, uma única instrução VLIW codifica múltiplas operações, prevendo pelo menos uma operação para cada unidade de execução do dispositivo. Por exemplo, se um processador VLIW possui cinco unidades de execução, uma instrução VLIW para esse dispositivo conterá cinco campos de operação, com cada campo especificando qual operação deve ser realizada na respectiva unidade de execução. Para acomodar esses campos de operação, as instruções VLIW têm tipicamente largura mínima de 64 bits, sendo consideravelmente mais largas em diversas arquiteturas.
Por exemplo, a linha a seguir ilustra uma instrução para o processador SHARC (Super Harvard Architecture Single-Chip Computer). Em um único ciclo, ela realiza uma multiplicação em ponto flutuante, uma adição em ponto flutuante e duas cargas com autoincremento. Todas essas operações estão contidas em uma única instrução de 48 bits:
f12 = f0 * f4, f8 = f8 + f12, f0 = dm(i0, m3), f4 = pm(i8, m9);
Desde os primórdios da arquitetura de computadores, algumas CPUs incorporaram várias unidades lógicas e aritméticas (ULAs) para operarem em paralelo. As CPUs superescalares utilizam hardware para decidir dinamicamente quais operações podem ser executadas em paralelo em tempo de execução, enquanto as CPUs VLIW utilizam software (o compilador) para decidir antecipadamente quais operações podem ser paralelizadas. Pelo fato de a complexidade do agendamento de instruções ser transferida para o compilador, a complexidade do hardware pode ser substancialmente reduzida.
Um problema análogo ocorre quando o resultado de uma instrução paralelizável é utilizado como entrada para um desvio condicional (branch). A maioria das CPUs modernas prevê qual caminho do desvio será tomado antes mesmo da conclusão do cálculo, de modo a carregar previamente as instruções desse caminho ou (em algumas arquiteturas) até mesmo iniciar sua computação por meio de execução especulativa. Caso a CPU erre a previsão, todas essas instruções e seu contexto precisam ser descartados do pipeline (pipeline flush) e as instruções corretas devem ser carregadas, o que acarreta penalidades de tempo.
Isso levou ao desenvolvimento de circuitos cada vez mais complexos de despacho de instruções e preditores de desvio na tentativa de acertar as previsões, descaracterizando a simplicidade original dos projetos RISC. O VLIW prescinde dessa lógica e, portanto, economiza o consumo de energia associado, evitando possíveis falhas de projeto e outros impactos negativos.
Em uma arquitetura VLIW, o compilador utiliza heurísticas ou otimização guiada por perfil (PGO) para estimar a direção de um desvio. Isso permite que ele reposicione e pré-agende operações de forma especulativa antes da execução do desvio, priorizando o caminho mais provável. Caso o desvio tome um caminho inesperado, o compilador já terá inserido código compensatório para descartar os resultados especulativos e preservar a semântica do programa.
Núcleos de processador vetorial (projetados para operar sobre grandes vetores unidimensionais de dados) podem ser combinados com a arquitetura VLIW, como ocorre no microprocessador FR-V da Fujitsu, ampliando ainda mais a taxa de transferência e a velocidade de processamento.
A Cydrome foi uma empresa que produziu processadores numéricos VLIW utilizando circuitos integrados de lógica de acoplamento pelo emissor (ECL) na mesma época (final da década de 1980). Essa empresa, a exemplo da Multiflow, encerrou suas atividades após alguns anos.
Uma das licenciadas da tecnologia da Multiflow foi a Hewlett-Packard, à qual Josh Fisher se juntou após o encerramento da Multiflow. Bob Rau, fundador da Cydrome, também ingressou na HP após o fechamento de sua empresa. Ambos lideraram as pesquisas em arquitetura de computadores na Hewlett-Packard durante a década de 1990.
Paralelamente a esses sistemas, no mesmo período (1989–1990), a Intel implementou VLIW no Intel i860, seu primeiro microprocessador de 64 bits e o primeiro processador a implementar VLIW em um único chip. Esse processador podia operar tanto no modo RISC simples quanto no modo VLIW:
No início dos anos 1990, a Intel introduziu o microprocessador RISC i860. Esse chip simples possuía dois modos de operação: um modo escalar e um modo VLIW. No modo VLIW, o processador sempre buscava duas instruções simultaneamente e assumia que uma era uma instrução inteira e a outra de ponto flutuante.
O modo VLIW do i860 foi amplamente utilizado em aplicações de processamento digital de sinais (DSP) para sistemas embarcados, visto que a execução das aplicações e os conjuntos de dados eram simples, bem ordenados e previsíveis, permitindo que os projetistas explorassem plenamente as vantagens da execução paralela do VLIW. No modo VLIW, o i860 mantinha um desempenho de ponto flutuante na faixa de 20 a 40 MFLOPS em precisão dupla, uma marca bastante elevada para a época e para um processador com frequência de 25 a 50 MHz.
Na década de 1990, a Hewlett-Packard pesquisou essa arquitetura como um desdobramento do desenvolvimento contínuo de sua família de processadores PA-RISC. Constatou-se que a CPU poderia ser enormemente simplificada ao se remover a complexa lógica de despacho do processador e transferi-la para o compilador. Como os compiladores daquela época eram muito mais avançados do que os da década de 1980, a complexidade adicional de software foi considerada um custo aceitável.
As CPUs VLIW são tipicamente compostas por múltiplas unidades de execução semelhantes a núcleos RISC que operam de forma independente. Modelos VLIW posteriores costumam contar com quatro a oito unidades principais de execução. Os compiladores geram as sequências iniciais de código para a CPU VLIW de maneira semelhante à das CPUs convencionais, produzindo sequências de instruções do tipo RISC. Em seguida, o compilador analisa esse código em busca de relações de dependência e requisitos de recursos, agendando as instruções de acordo com essas restrições. Nesse processo, instruções independentes são alocadas para execução simultânea. Como as arquiteturas VLIW normalmente representam as instruções paralelas em uma palavra de instrução mais longa que engloba as operações individuais, isso resulta em um código de operação (opcode) muito mais extenso (denominado muito longo) para especificar o que deve ser executado a cada ciclo.
Exemplos de processadores VLIW incluem a linha de processadores de mídia TriMedia da NXP Semiconductors (anteriormente Philips Semiconductors), os DSPs SHARC da Analog Devices, a família ST200 da STMicroelectronics baseada na arquitetura Lx (projetada no laboratório da HP de Josh Fisher por Paolo Faraboschi), o FR-V da Fujitsu, o BSP15/16 da Pixelworks, o CEVA-X DSP da CEVA, o Jazz DSP da Improv Systems, a série HiveFlex da Silicon Hive e a família MPPA Manycore da Kalray. A linha de DSPs TMS320 da Texas Instruments evoluiu, em sua família C6000, para uma arquitetura VLIW, em contraste com a família anterior C5000. Um ou mais núcleos Qualcomm Hexagon foram empregados em projetos de telefones celulares. Esses processadores VLIW são utilizados principalmente como processadores de mídia embarcados para eletrônicos de consumo.
Recursos VLIW também foram incorporados a núcleos de processadores configuráveis para projetos de sistema em um chip (SoC). Por exemplo, o processador Xtensa LX2 da Tensilica incorpora uma tecnologia chamada Flexible Length Instruction eXtensions (FLIX), que permite instruções multioperação. O compilador C/C++ do Xtensa pode intercalar livremente instruções FLIX de 32 ou 64 bits com as instruções RISC padrão de operação única do processador, que possuem 16 ou 24 bits de largura. Ao compactar múltiplas operações em uma palavra de instrução larga de 32 ou 64 bits e permitir que essas instruções sejam mescladas com instruções RISC mais curtas, o FLIX permite que os projetistas de SoC aproveitem os ganhos de desempenho do VLIW enquanto eliminam o inchaço de código (code bloat) das primeiras arquiteturas VLIW.
O DSP Carmel da Infineon é outro núcleo VLIW voltado para SoC. Ele utiliza um método similar de otimização da densidade de código denominado palavra de instrução longa configurável (CLIW, do inglês configurable long instruction word).
Fora do mercado de sistemas embarcados, a arquitetura IA-64 do Intel Itanium baseada em computação com conjunto de instruções explicitamente paralelas (EPIC) e o Elbrus 2000 figuram como os principais exemplos de arquiteturas VLIW para computação geral. Contudo, a arquitetura EPIC é por vezes diferenciada de uma arquitetura VLIW pura, visto que preconiza predicação total de instruções, bancos de registradores rotativos e palavras de instrução muito longas capazes de codificar grupos de instruções não paralelas. Os projetos VLIW também obtiveram penetração expressiva no mercado de unidades de processamento gráfico (GPUs), embora tanto a Nvidia quanto a AMD tenham migrado posteriormente para arquiteturas do tipo RISC/SIMT visando aprimorar o desempenho em cargas de trabalho de computação genérica não gráficas.
A microarquitetura TeraScale para unidades de processamento gráfico (GPUs), desenvolvida pela ATI Technologies e pela Advanced Micro Devices (AMD), é uma microarquitetura VLIW.
Em dezembro de 2015, o primeiro lote comercial de computadores baseados no processador VLIW Elbrus-4S foi lançado na Rússia.
O processador Neo, da REX Computing, consiste em uma malha 2D de núcleos VLIW voltada para eficiência energética.
O Elbrus 2000 (em Эльбрус 2000) e seus sucessores são microprocessadores russos VLIW de 512 bits desenvolvidos pelo Centro de Tecnologias SPARC de Moscou (MCST) e fabricados pela TSMC.
Quando os avanços na fabricação de semicondutores permitiram a construção de processadores com maior número de unidades de execução, os programas compilados para gerações anteriores não podiam ser executados nas novas implementações mais amplas sem recompilação, visto que a codificação binária das instruções dependia diretamente da quantidade de unidades de execução físicas da máquina.
A Transmeta contornou essa limitação ao introduzir uma camada de software de compilação binário-para-binário (denominada code morphing) em sua implementação Crusoe da arquitetura x86. Esse mecanismo recompilava, otimizava e traduzia os opcodes x86 dinamicamente em tempo de execução para o código de máquina interno da CPU. Dessa forma, o chip da Transmeta era internamente um processador VLIW, totalmente desacoplado do conjunto de instruções CISC x86 que executava externamente.
A arquitetura do Intel Itanium (entre outras) solucionou o problema da retrocompatibilidade por meio de um mecanismo mais abrangente. Dentro de cada instrução com múltiplos opcodes, reserva-se um campo de bits para indicar a dependência em relação à instrução VLIW anterior no fluxo do programa. Esses bits são definidos em tempo de compilação, desonerando o hardware do cálculo dinâmico dessa dependência. A codificação dessas informações no próprio fluxo de instruções permite que implementações mais amplas emitam múltiplas instruções VLIW independentes em paralelo por ciclo, enquanto implementações mais estreitas emitem um número menor de instruções VLIW por ciclo.
Outra desvantagem observada nos projetos VLIW é o inchaço de código (code bloat), que ocorre quando uma ou mais unidades de execução não possuem operações úteis a realizar em determinado ciclo e precisam executar instruções de não operação (NOP). Isso acontece na presença de dependências no código, quando os pipelines de instrução devem ser drenados antes que operações subsequentes possam prosseguir.
Com o aumento da densidade de transistores por chip, algumas das desvantagens históricas do VLIW tornaram-se menos críticas. As arquiteturas VLIW mantêm ampla presença no mercado de sistemas embarcados e processadores especializados de sinal e multimídia, onde é viável customizar o processador para aplicações dedicadas em projetos de sistema em um chip.
For his dissertation Bulldog: A Compiler for VLIW Architecture.