El processament de fluxos és un paradigma de programació computacional, equivalent a la programacio amb flux de dades, processament de flux d'esdeveniments, i programació reactiva, que permet a algunes aplicacions explotar més fàcilment una forma limitada de processament paral·lel. Tals aplicacions poden utilitzar unitats computacionals múltiples, com les FPUs en un GPU o field programmable gate arrays (FPGAs), sense una assignació de control explicita, sincronització, o comunicació entre les unitats.

El paradigma de processament de fluxos simplifica la paral·lelització del programari i maquinari amb la restricció de la computació paral·lela que es pot realitzar. Donada una seqüència de dades (stream), una sèrie d'operacions (funcions del nucli), s'aplican a cada element de la seqüència. El flux uniforme, on un nucli de la funció s'aplica a tots els elements del flux, és típic. Les funcions del nucli solen ser en canonada, i la memòria local del chip és reutilitzada per a minimitzar l'amplada de banda de la memòria externa. Des del nucli i el flux d'abstraccions exposen les dependències de dades, les eines de compilació poden automatitzar completament i optimitzar les tasques de gestio del chip. El processament de fluxos pot utilitzar algorismes marcadors, per exemple, per al llançament de DMAs en temps d'execució, quan les dependències són conegudes. L'eliminació de l'administrador de DMA manual redueix la complexitat programari, i l'eliminació de les caches de maquinari redueix la quantitat d'area no dedicada a unitats computacionals com les ALUs.

Durant la dècada de 1980 el flux de processament va ser explorat en programació de flux de dades. Un exemple és el llenguatje SISAL (Corrents d'Iteració en una Sola Assignació de Llengua).

Aplicacions El processament de dades és essencialment un compromis, conduït per un model centrat en dades que treballa molt bé per aplicacions tipus GPU o DSP (com imatge, vídeo i processament de senyal digital) però menys per a aquelles de processament de propòsit general amb més accésos de dada aleatoris (com bases de dades). Sacrificant flexibilitat en el model, les implicacions es tornes més fàcils, amb una execució més ràpida i eficaç. Depenent del context, el disseny del processador pot ser modificat per obtenir eficàcia màxima o una gran flexibilitat.

El processament de fluxos és especialment adequat per aplicacions que contenen aquestes 3 característiques: Intensitat Computacional, el nombre d'operacions d'aritmètiques per E/S o referència de memòria global. A moltes aplicacions de processament del senyal d'avui en dia, estan per sobre de 50:1 i augmentant la complexitat algorítmica.

Paral·lelisme de dades existeix en un kernel si la mateixa funció és aplicada a totes les referències d'un corrent d'entrada i un nombre de referències poden ser processades simultàniament sense esperar a resultats de dades anteriors.

Localitat de Dades és un tipus específic de localitat temporal comuna dins de processaments de senyals i aplicacions de mitjans on les dades són produïdes un cop, llegides una vegada o dues més tard en l'aplicació, i que mai es tornen a llegir. Els fluxes intermedis que passen entre kernels així com dades intermèdies dins de les funcions del kernel poden capturar aquesta localitat directament utilitzant el model de programació de processament de fluxos. Exemples dels rècords dins de corrents inclouen: En gràfics, cada referència podria ser el vertex, normal, i informació de color per un triangle;

Dins processament d'imatge, cada referència podria ser un píxel sol d'una imatge;

En un codificador de vídeo, cada referència poden ser 256 píxels formant un macroblock de dades; o

En un processament de senyal sense fil, cada referència podria ser una seqüència de les mostres rebudes d'una antena. Per cada referència només podem llegir de l'entrada, fer operacions amb aquestes dades, i escriure a la sortida. Podem tenir entrades múltiples i sortides múltiples, però mai un troç de memòria que es pugui llegir i escriure.

Comparació amb anteriors paradigmes paral·lels Els ordinadors bàsics van començar d'un paradigma d'execució seqüencial. Les CPUs tradicionals estan basades en SISD, el qual significa que conceptualment fan només una operació a la vegada. Mentre les necessitats informàtiques han anat evolucionant, la quantitat de dades a ser tractades augmenta molt de pressa. Va resultar obvi que el model de programació seqüencial no podria suportar la necessitat de més capacitat de processament. S'han produït diversos esforços per trobar maneres alternatives per actuar amb quantitats massives de dades computacionals però l'única solució era explotar algun nivell d'execució paral·lela. El resultat d'aquells esforços van ser el SIMD, un paradigma de programació que va permetre aplicar una instrucció a casos múltiples de (diferent) dades. Gairebé sempre, SIMD era utilitzat en un entorn de SWAR. Per utilitzar estructures més complexes, també es podria utilitzar paral·lelisme MIMD.

Encara que aquests dos paradigmes eren eficients, les implementacions del món real estaven plenes de limitacions des d'alineament de memoria a problemes de sincronització i el paral·lelisme limitat. Només uns pocs processadors SIMD van sobreviure com a components independents; la majoria van ser incrustats en les CPU estàndard.

Penseu un programa simple suma de dues matrius que contenen 100 vectors de 4 components (és a dir 400 números en total).

Paradigma sequencial convencional for (int i = 0; i < 100 * 4; i++) result[i] = source0[i] + source1[i]; Aquest es el paradigma sequencial mes comú. Existeixesn variants (com bucles interns i altres estructures), però en última instància es redueixen a aquesta estructura.

Paradigma paral·lel SIMD, registres empaquetats (SWAR) for (int el = 0; el < 100; el++) // for each vector vector_sum(result[el], source0[el], source1[el]);

Això esta simplificat. Asumeix que la instrucció vector_sum funciona. Tot i que això és el que succeeix amb les característiques intrínseques d'instrucció, molta de la informació en realitat no es te en compte com el nombre de components de vector i el seu format de dades. Això es fa per a major claredat.

Es pot veure però, aquest mètode redueix el nombre d'instruccions descodificades de numElements * componentsPerElement a numElements. El nombre d'instruccions de salt també es redueix, ja que el bucle s'executa menys vegades. Aquestes millores són el resultat de l'execució paral·lela de les quatre operacions matemàtiques.

El que va passar però, és que el registre SIMD empaquetat té una certa quantitat de dades, de manera que no és possible obtenir més paral·lelisme. La velocitat és una mica limitada per la suposició de que hem fet quatre operacions paral·leles (tingueu en compte que això és comú per a tots dos AltiVec i SSE).

Paradigma de flux paral·lel (SIMD/MIMD) // This is a fictional language for demonstration purposes. elements = array streamElement([number, number]) kernel = instance streamKernel("@arg0[@iter]") result = kernel.invoke(elements)

En aquest paradigma, es defineix el conjunt de dades, en lloc de cada bloc de components sent definit per separat. Descrivim el conjunt de dades en les dues primeres files. Després d'això, el resultat s'infereix de les fonts i el nucli. Per simplicitat, hi ha un mapejat 1: 1 entre les dades d'entrada i sortida, però això no té per què ser així. Els nuclis aplicats poden ser molt més complexos.

Una implementació d'aquest paradigma pot "desenrotllar" un bucle intern. Això permet que el rendiment escali fàcilment amb la complexitat de xip utilitzant centenars de ALUs. L'eliminació de patrons de dades complexes fa que gran part d'aquesta energia addicional estigui disponible.

Tot i que el processament de flux és una branca de processament SIMD / MIMD, no s'han de confondre entre elles. Tot i que les implementacions de SIMD poden treballar usualment com a "flux", el seu rendiment no és comparable: el model preveu un patró d'ús molt diferent que permet molt més rendiment per si mateix. S'ha observat que quan aquest s'aplica en els processadors genèrics com ara CPU estàndard, només un augment de velocitat 1,5x pot ser assolit. Per contra, processadors de flux ad-hoc arriben fàcilment a obtenir sobre 10x de rendiment, això s'atribueix principalment a l'accés a memòria més eficient i més alts nivells de processament en paral·lel.

Encara que hi ha diversos graus de flexibilitat permesa pel model, els processadors de flux generalment imposen algunes limitacions en la mida del nucli o ample del flux. Per exemple, el maquinari del consumidor sovint no té la capacitat de realitzar operacions matemàtiques d'alta precisió, no té cadenes de indirecció complexes o presenta límits inferiors sobre el nombre d'instruccions que poden ser executades.

Recerca Entre els projectes de processament de flux de la Universitat Stanford s'inclouen "Stanford Real-Time Programmable Shading Project" el cual va començar al 1999. Un prototip anomenat Imagine que es va desenvolupar a l'any 2002. Un projecte anomenat Merrimac va funcionar fins al voltant de 2004. AT&T també va investigar processadors de flux millorada com les unitats de processament gràfic evolucionat ràpidament, tant en velocitat i funcionalitat. Des d'aquests primers dies dels llenguatges de processament de flux dotzenes s'han desenvolupat, així com maquinari especialitzat.

Notes del model de programació El repte més immediat en l'àmbit de processament en paral·lel no resideix tant en el tipus d'arquitectura de maquinari utilitza sino en quant fàcil serà programar el sistema en qüestió en un entorn real amb un rendiment acceptable. Màquines com Imagine utilitzen un model d'un sol fil amb dependències automatitzades, assignació de memòria i programació de DMA. Això en si mateix és el resultat de la investigació al MIT i Stanford a la recerca d'una superposició de tasques 'òptima' entre el programador, eines i maquinari. Els programadors van superar a les eines en algoritmes de mapeig per paral·lelitzar el maquinari, i les eines van superar als programadors a l'hora d'esbrinar els esquemes més intel·ligents d'assignació de memòria, etc. En concret els dissenys MIMD com ara Cell, per als quals el programador necessita fer front a la partició d'aplicació a través de múltiples nuclis i tractar amb sincronització de processos i l'equilibri de càrrega. Les eines de programació multi-nucli eficients d'avui no tenen prou avanç.

Un inconvenient de la programació SIMD es el tema de la Matriu de Estructures (MdE) i també el de estructura de matrius (EdM). Els programadors sovint volien construir estructures de dades amb un significat 'real', per exemple: // A particle in a three-dimensional space. struct particle_t { float x, y, z; // not even an array! unsigned byte color; // 8 bit per channel, say we care about RGB only float size; // ... and many other attributes may follow...