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.

História

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.

Motivação

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.

Projeto

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.

Implementações

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: