# Stream processing

Stream Processing (ou Processamento de Fluxo em tradução livre), consistem em um modelo de processamento semelhante a SIMD (single instruction, multiple data), possibilitando que aplicações possam explorar limitadas formas de processamento paralelo. Essas aplicações podem usar múltiplas unidades de processamento, como FPU's (unidade de ponto flutuante) de uma GPU ou Field-programmable gate array, sem gerir explicitamente a alocação, sincronização ou comunicação entre as unidades.
O stream processing simplifica softwares e hardwares paralelos restringindo a computação paralela que pode ser executada. Dado um conjunto de dados (um fluxo ou stream), uma série de operações (funções do kernel) é aplicada a cada elemento na corrente, ou seja, um streaming uniforme, onde uma operação é aplicada a todos os elementos do fluxo. Hardware de stream processing podem usar scoreboarding, por exemplo, para lançar DMA em tempo de execução, quando dependências tornam-se conhecidas. A eliminação de gestão manual do DMA reduz a complexidade do software.

## Aplicações

Processamento de fluxo é essencialmente um compromisso, impulsionado por um modelo centrado em dados, que funciona muito bem para DSP ou aplicações tradicionais da GPU (como imagem, vídeo e processamento de sinal digital), mas nem tanto para o processamento de uso geral com acesso a dados mais randomizado (como bancos de dados). Ao sacrificar alguma flexibilidade no modelo, as implicações permitem a execução mais fácil, mais rápida e eficiente. Dependendo do contexto, o design do processador pode ser ajustado para o máximo de eficiência ou de um trade-off para a flexibilidade.
Processamento de fluxo é especialmente adequado para aplicações que apresentam três características de aplicação:
* Intensidade Computacional (alta proporção de operações aritméticas por I/O).
* Paralelismo de dados, permitindo haver um fluxo onde a mesma função e aplicada a todos registros de entrada.
* Capacidade de aplicar o pipeline de dados onde os dados são continuamente alimentados dos produtores aos consumidores.

## Comparação com paradigmas paralelos anteriores

Computadores básicos começaram a partir de um paradigma de execução sequencial. CPUs tradicionais se baseiam em SISD, o que significa que conceitualmente executam apenas uma operação de cada vez. Com as necessidades de computação de um mundo desenvolvido, a quantidade de dados a serem administrados evoluíram muito rapidamente. Era óbvio que o modelo de programação sequencial não poderia lidar com a crescente necessidade de poder de processamento. Vários esforços têm sido gastos em encontrar formas alternativas para realizar grandes quantidades de cálculos, mas a única solução era explorar algum nível de execução paralela. O resultado desses esforços foi SIMD, um paradigma de programação que permitiu a aplicação de uma instrução para várias instâncias de dados (diferentes). Na maioria das vezes, SIMD estava a ser utilizado num ambiente SWAR. Usando estruturas mais complicadas, também podem ter MIMD.
Embora esses dois paradigmas foram eficientes, as implementações do mundo real foram atormentados com limitações de problemas de alinhamento de memória para problemas de sincronização e paralelismo limitado. Apenas alguns processadores SIMD sobreviveram como componentes autônomos: a maioria aplicados em CPUs padrão.
Enquanto processamento de fluxo é um ramo da adaptação de SIMD/MIMD, eles não devem ser confundidos. Embora implementações SIMD possam muitas vezes trabalhar em um "fluxo contínuo", o seu desempenho não é comparável: o modelo prevê um padrão de uso muito diferente que permite muito maior desempenho por si só. Tem-se observado que, quando aplicado em processadores genéricos tais como a CPU padrão, apenas um aumento de velocidade de 1,5x pode ser alcançado. Por outro lado, processadores stream ad-hoc chegam facilmente aos 10x mais performance, atribuído principalmente ao acesso à memória mais eficiente e níveis mais altos de processamento paralelo.
Embora existam vários graus de flexibilidade permitida pelo modelo, processadores stream normalmente impõem algumas limitações no tamanho do kernel ou stream. Por exemplo, hardware consumidor muitas vezes não tem a capacidade de executar alta precisão matemática e apresenta limites inferiores para o número de instruções que podem ser executadas.

## Considerações Importantes

Qualquer documentação acerca de Processadores de Fluxo é muito escassa. Apenas algumas instituições especializadas parecem ter entendido o poder implícito do modelo. A Universidade de Stanford tem sido historicamente envolvida em uma variedade de projetos nesta área, começando com a implantação da linguagem Stanford Shading e lançando um processador de fluxo flexível stand-alone chamado Imagine. Ambos os projetos revelou que o paradigma tem um grande potencial, tanto que um projeto de maior escala foi iniciado. Com o nome de Merrimac, um supercomputador baseado em Stream, já está sendo pesquisado. A empresa AT&T também reconheceu a ampla adoção de processadores aprimorados para Streams como GPUs evoluíram rapidamente em termos de velocidade e funcionalidade.