A arquitetura de fluxo de dados (em inglês: dataflow architecture) é uma arquitetura de computadores baseada em fluxo de dados que contrasta diretamente com a tradicional arquitetura de von Neumann ou arquitetura de fluxo de controle. Conceitualmente, as arquiteturas de fluxo de dados não possuem contador de programa: a prontidão e a execução das instruções são determinadas exclusivamente com base na disponibilidade de seus argumentos de entrada, de modo que a ordem em que as instruções são processadas pode ser imprevisível.

Embora nenhum computador de uso geral comercialmente bem-sucedido tenha adotado uma arquitetura de fluxo de dados pura, ela foi implementada com êxito em hardwares especializados, tais como em processamento de sinal digital, roteamento de redes, processamento gráfico, telemetria e, mais recentemente, em data warehousing e inteligência artificial (como fluxo de dados polimórfico, mecanismos de convolução, arquiteturas orientadas por estrutura e escalonamento por fluxo de dadosS. Lie, "Cerebras Architecture Deep Dive: First Look Inside the HW/SW Co-Design for Deep Learning : Cerebras Systems," 2022 IEEE Hot Chips 34 Symposium (HCS), Cupertino, CA, USA, 2022, pp. 1-34, doi: 10.1109/HCS55958.2022.9895479. https://ieeexplore.ieee.org/document/9895479). Esse paradigma também é amplamente relevante em arquiteturas de software contemporâneas, incluindo motores de banco de dados e frameworks de computação paralela.

Arquiteturas síncronas de fluxo de dados são ajustadas para atender às cargas de trabalho de aplicações de caminho de dados em tempo real, como o encaminhamento de pacotes na velocidade do meio físico (wire speed). Arquiteturas de fluxo de dados com comportamento determinístico permitem aos programadores gerenciar tarefas complexas, como o balanceamento de carga, a sincronização entre processadores e o acesso a recursos compartilhados.

Paralelamente, há uma sobreposição de terminologia, já que a expressão fluxo de dados também é utilizada para denominar um subcampo da programação paralela: a programação por fluxo de dados.

História Um precursor notável dos conceitos de fluxo contínuo e fluxo de dados foi o supercomputador Harvest (7950) da IBM, construído para a NSA em 1962, que processava fluxos ininterruptos de operandos diretamente através de pipelines lógicos e tabelas de consulta dedicadas, contornando os ciclos convencionais de busca e execução de instruções.

As arquiteturas de hardware baseadas em fluxo de dados foram um dos principais temas de pesquisa em arquitetura de computadores durante a década de 1970 e o início da década de 1980. Jack Dennis, do MIT, foi pioneiro no estudo de arquiteturas de fluxo de dados estáticas, enquanto a Máquina de Fluxo de Dados de ManchesterManchester Dataflow Research Project, Research Reports: Abstracts, September 1997 e a arquitetura Tagged Token do MIT destacaram-se como os maiores projetos no âmbito do fluxo de dados dinâmico.

Contudo, essas pesquisas encontraram barreiras técnicas que nunca foram plenamente superadas:

A difusão eficiente de fichas de dados (data tokens) em um sistema maciçamente paralelo; O despacho eficiente de fichas de instruções (instruction tokens) em redes de grande escala; A viabilidade de construir memórias endereçáveis por conteúdo (CAM) suficientemente grandes para armazenar todas as dependências de um programa real.

As instruções e suas dependências de dados revelaram-se refinadas demais (granularidade excessivamente fina) para serem distribuídas eficientemente por uma malha de interconexão abrangente. O tempo gasto pelas instruções e pelos resultados etiquetados para trafegar pela rede era frequentemente maior do que o tempo necessário para realizar as próprias computações.

Em 1995, Maurice Wilkes escreveu que:

A execução fora de ordem (OOE) consolidou-se como o paradigma de computação predominante a partir da década de 1990, consistindo em uma forma restrita de fluxo de dados. Esse paradigma introduziu a noção de "janela de execução". A janela de execução preserva a ordem sequencial da arquitetura de von Neumann; contudo, dentro de seus limites, as instruções podem ser concluídas de acordo com a ordem de dependência de seus dados. Isso é viabilizado por CPUs que etiquetam dinamicamente as dependências de dados do código dentro da janela. A complexidade lógica exigida para monitorar essas dependências em tempo real limita as CPUs com execução fora de ordem a um pequeno número de unidades funcionais (geralmente entre 2 e 6) e a janelas de execução com dimensões entre 32 e 200 instruções — muito menores do que as pretendidas para as máquinas de fluxo de dados puras.

Tópicos em arquitetura de fluxo de dados

Máquinas estáticas e dinâmicas Os projetos que utilizam endereços de memória convencionais como etiquetas de dependência de dados são chamados de máquinas de fluxo de dados estáticas. Essas máquinas não permitiam que múltiplas instâncias da mesma sub-rotina fossem executadas simultaneamente, visto que as etiquetas simples não eram capazes de diferenciá-las.

Já os projetos que utilizam memória associativa (CAM) são denominados máquinas de fluxo de dados dinâmicas. Elas empregam etiquetas na memória para identificar o contexto da execução, facilitando o paralelismo em nível de laços e chamadas recursivas.

Compilador Em arquiteturas de fluxo de controle convencionais, os compiladores analisam o código-fonte em busca de dependências de dados entre instruções com o intuito de ordenar as sequências de instruções nos arquivos binários finais. As instruções são organizadas linearmente, mas a informação explícita de dependência não é gravada no código executável. Em contrapartida, os binários compilados para uma máquina de fluxo de dados contêm esse grafo de dependências diretamente em sua estrutura.

Um compilador de fluxo de dados registra essas relações criando identificadores exclusivos (etiquetas ou tags) para cada dependência, em vez de recorrer a nomes de variáveis fixos. Ao atribuir uma etiqueta única a cada dependência, permite-se que segmentos independentes do código binário sejam executados fora de ordem e em paralelo. O compilador é responsável por identificar laços de repetição, desvios condicionais e outras estruturas de controle da linguagem e traduzi-los para o grafo de fluxo de dados.

Programas Os programas são carregados na memória associativa (CAM) do computador de fluxo de dados dinâmico. Quando todos os operandos identificados de uma instrução tornam-se disponíveis (ou seja, quando são produzidos por instruções precedentes ou fornecidos pela entrada do usuário), a instrução é classificada como pronta para execução por uma unidade funcional.

Esse processo é denominado "ativação" ou "disparo" (firing) da instrução. Assim que a instrução é concluída pela unidade de execução, seus dados de saída são enviados (junto com sua respectiva etiqueta) para a CAM. Quaisquer instruções que dependam daquele dado específico (reconhecido pelo valor da etiqueta) são então marcadas como prontas. Dessa forma, as instruções subsequentes são processadas na ordem correta, prevenindo condições de corrida. Essa ordem de execução pode divergir amplamente da sequência linear planejada pelo programador humano no código-fonte.

Instruções Uma instrução, acompanhada por seus operandos de dados correspondentes, é transmitida a uma unidade de execução na forma de um pacote, comumente chamado de "ficha de instrução" (instruction token). De modo análogo, os dados resultantes são devolvidos à CAM como "fichas de dados" (data tokens). A fragmentação das instruções e resultados em pacotes independentes possibilita a execução paralela massiva de operações aptas.

Redes internas de interconexão conduzem os tokens de instrução até as unidades funcionais e transferem os tokens de dados de volta à CAM. Em contraste com a arquitetura de von Neumann clássica, os tokens de dados não residem de modo permanente na memória; tratam-se de mensagens transitórias que existem apenas enquanto estão a caminho do armazenamento de instruções.

Histórico e desdobramentos modernos Em contraste com os sistemas digitais programáveis, os analisadores diferenciais analógicos eram inteiramente fundamentados em hardware sob a forma de uma arquitetura de fluxo de dados: as computações não eram orientadas por um conjunto formal de instruções e não envolviam tomadas de decisão armazenadas em memória. A operação baseava-se na interconexão física de componentes de cálculo especializados, formando uma arquitetura passiva de fluxo de dados.

Em outubro de 2024, a empresa NextSilicon anunciou o lançamento do acelerador Maverick-2, um chip baseado em arquitetura de fluxo de dados voltado para computação de alto desempenho (HPC). O processador foi adotado pelos Laboratórios Nacionais de Sandia para equipar o supercomputador experimental Spectra.

Em julho de 2025, a startup Efficient Computer apresentou o processador Electron E1, desenvolvido com base em princípios de fluxo de dados para operar com consumo de energia ultraeficiente.

Ver também

Computação paralela SISAL Matriz sistólica Arquitetura disparada por transporte Rede em chip (NoC) System-on-a-chip (SoC) Computação na memória

Referências

Categoria:Computadores Categoria:Arquitetura de computadores