En computació, un processador vectorial és una unitat de processament central (CPU) que implementa un conjunt d'instruccions les quals operen en matrius unidimensionals de dades anomenats vectors. La principal diferència entre un processador vectorial i un escalar rau en el fet que el processador vectorial és capaç de descodificar instruccions els operands de les quals són vectors complets, mentre que les instruccions d'un processador escalar només poden operar sobre elements de dades individuals. Els processadors vectorials poden millorar en gran manera el rendiment en certes càrregues de treball, en particular la simulació numèrica i tasques similars. Els computadors vectorials van aparèixer en la dècada de 1970 i es van establir com a disseny dominant en els supercomputadors, però, la ràpida caiguda de la relació preu-rendiment dels dissenys de microprocessadors convencionals va conduir a la desaparició dels supercomputadors vectorials al final dels anys 1990. En l'actualitat, la majoria dels microprocessadors convencionals contenen un repertori d'instruccions vectorials les quals els fan capaços d'operar sobre vectors. La conversió d'un programa o algorisme corresponent a un processador escalar a un altre vectorial s'anomena vectorització. Processament vectorial miniatura|Taula 1. Operacions vectorials. Un operand vectorial conté una seqüència de n elements, anomenats components, on n és la longitud del vector. Cadascun dels components del vector és un escalar de qualsevol tipus (enter, punt flotant, etc). Els operadors vectorials poden tenir una de les següents cinc formes (podria haver-hi alguna més, però no tenen interès pràctic): f1: V →V (operació vectorial unitària) f2: V × V → V (operació vectorial binària) f3: V → K (reducció unitària) f4: V × V → K (reducció binària) f5: K × V → V (operació d'escalat) on V i K representen, respectivament, un espai vectorial i un cos.

En la taula 1 es poden veure una sèrie d'exemples d'operadors vectorials. En aquesta taula, a, b, c ∈ V, ai, bi, i ci són, respectivament, les components i-èssimes d'aquests vectors, s ∈ K i n = dim V.

Casos especials d'operacions vectorials binàries són les operacions d'empaquetament i desempaquetament, on un dels vectors actua com a màscara i el vector resultat té una mida diferent a la dels operands. Aquestes operacions tenen molta utilitat en el tractament de matrius disperses, que són matrius amb la majoria dels seus elements nuls.

Les màquines vectorials proporcionen operacions que treballen sobre vectors. Una instrucció vectorial és equivalent a l'execució d'un bucle complet d'operacions ordinàries, on cada iteració treballa sobre cadascuna de les components del vector. Les operacions vectorials tenen alguns avantatges sobre les escalars: En les operacions vectorials, cada resultat és independent dels anteriors. Això permet efectuar els càlculs en un processador segmentat sense que existeixin conflictes per dependències de dades. Una simple instrucció vectorial substitueix a moltes escalars. Per això, el coll d'ampolla produït per la lectura d'aquesta instrucció és petit, comparat amb el que produiria tot el conjunt d'instruccions escalars equivalents. Les instruccions vectorials que necessiten accedir a memòria ho fan amb un patró d'accés fix (normalment adjacents). Això facilitarà la seva lectura paral·lela mitjançant una memòria entrellaçada. En qualsevol cas, si no es disposés de memòries entrellaçades, les posicions de memòria adjacents es carregaran a la memòria cau, amb el consegüent estalvi de temps. Si s'utilitza una instrucció vectorial, evitarem el risc de control de salt de bucle, que es produiria si processéssim les instruccions escalars equivalents en un processador segmentat. Per totes aquestes raons, les operacions vectorials poden executar-se d'una forma molt més ràpida que la seqüència d'instruccions escalars equivalents sobre el mateix conjunt de dades, per això la tendència al disseny i fabricació de màquines vectorials en aplicacions on aquest tipus d'operacions s'utilitzen amb suficient freqüència.

Segmentació i processadors vectorials Vist l'anterior, sembla clar que els computadors vectorials han de basar la seva unitat d'execució en un processador segmentat que prendrà una per una totes les components del vector i les anirà processant sense dependències de dades ni control durant l'execució de tota la instrucció vectorial. La majoria dels computadors vectorials actuals treballen d'aquesta manera. Una altra possibilitat més costosa és la divisió funcional, mantenint una unitat d'execució per a cada component del vector. L'alt cost d'aquesta solució no sol justificar-la. Per altra part, aquest tipus de solució precisa que els vectors tinguin una longitud limitada; amb un processador segmentat, les components poden anar entrant i sortint per la llera sense límit de components, encara que, evidentment, un vector més llarg trigarà més temps en processar-se.

Arquitectura dels processadors vectorials miniatura|Fig 1. Processador vectorial memòria-memòria.|520x520px Una primera versió, molt simplificada, de processador vectorial és el mostrat a la figura 1. Aquest tipus de màquina representa un processador vectorial memòria-memòria que és capaç d'extreure dos vectors de memòria i operar sobre ells. L'inconvenient d'aquest tipus de màquina seria el coll d'ampolla que suposarien els accessos a memòria. Per pal·liar aquest problema, es poden realitzar les següents millores: Augmentar l'amplada de banda de la memòria: això s'aconsegueix entrellaçant la memòria, de forma que aquesta tingui varis mòduls i es pugui accedir simultàniament a diverses posicions consecutives que es trobin en mòduls diferents Afegir una memòria intermèdia de major velocitat entre la memòria i el processador. Una forma de fer això, a més a més d'incorporar una memòria cau, és afegir un banc de registres vectorials. Per a tot això, és habitual que els processadors vectorials disposin d'un banc (o múltiples bancs) de registres vectorials que facin de memòria intermèdia; es parla, llavors, de processadors vectorials registre-registre. Per altra banda, la majoria dels processadors vectorials actuen com coprocessadors d'un processador escalar convencional que tracta les instruccions no vectorials. Això fa que l'arquitectura d'un computador vectorial actual sigui la que es mostra a la figura 2. Com es pot veure, els computadors vectorials poden considerar-se com computadors del tipus SIMD en la Taxonomia de Flynn, però, s'ha de tenir en compte que, si bé els computadors vectorials executen la mateixa instrucció sobre dades diferents, aquestes dades formen part del mateix flux. Per això, en alguns casos, a aquestes màquines se'ls anomenen SIMD-vectorials. miniatura|Fig 2. Processador vectorial registre-registre|520x520px

Rendiment dels processadors vectorials Basant-nos en l'anterior, es presenta un model per avaluar el rendiment dels processadors vectorials. Es prendrà per a fer aquesta avaluació, un càlcul vectorial sobre vectors de n components en un bucle que s'hagi de seccionar. En el càlcul d'aquest rendiment intervenen les següents variables: El temps necessari per a processar cada component en una iteració del bucle. Denominarem aquest temps tp. El temps d'inicialització de cada bucle provocat pel seccionament. Aquest temps es pot desglossar en dues parts: el temps del codi escalar necessari pel seccionament (ts) i el temps d'arrencada de la instrucció vectorial (ta). El temps ocupat per l'arrancada del programa, càrrega inicial dels vectors en els registres, etc. (tb). Màxim nombre de components que el vector es capaç d'allotjar (MVL). Amb tot això, el temps necessari per al càlcul total serà:

El guany de temps respecte a un processador segmentat escalar rau, més que en la millora del temps de càlcul pròpiament dit, en el temps necessari per a llegir i descodificar les instruccions. També es pot guanyar temps si es disposa de diversos fluxos aritmètics perquè sigui possible executar diverses instruccions vectorials de forma simultània.

Hi ha alguns paràmetres que poden ajudar a avaluar la qualitat d'un processador vectorial referits a la longitud del vector que s'estigui tractant, aquests són: Rn: és la velocitat en MFLOPS sobre un vector de longitud n. Per extensió i de forma ideal R∞ és la velocitat del processador per a un vector de longitud infinita. La diferència entre aquestes mesures indicaran les penalitzacions en el rendiment degudes a la longitud finita dels vectors. N1/2: és la longitud necessària per assolir una velocitat de R∞/2. Nv: és la longitud necessària per fer el mode vectorial més ràpid que l'escalar. Aquesta mesura avalua les pèrdues de rendiment a causa a les operacions addicionals necessàries en el procés vectorial respecte a l'escalar. A continuació es veu una forma d'avaluar l'eficiència dels processadors vectorials: sigui r la relació entre les velocitats de procés vectorial i escalar, i sigui fv la fracció de codi vectoritzable. Prenent com a unitat el temps que trigaria a executar-se el procés si la màquina fos totalment escalar, tindrem que el guany de velocitat d'un processador vectorial serà:

L'eficiència del sistema vindria donada, doncs, per:

Aquestes expressions es refereixen al cas ideal en què el processador vectorial no tingui pèrdues per causes diferents del codi no vectoritzable. Per altra banda, les expressions anteriors no són més que una altra forma d'expressar la llei d'Amdahl.

Característiques dels llenguatges pel processament vectorial L'ús de llenguatges seqüencials en computadors vectorials pot fer perdre el paral·lelisme d'un algorisme vectoritzable. És, per tant, necessària l'existència de llenguatges adequats als computadors vectorials. Aquests llenguatges haurien de tenir una sèrie de propietats per a expressar el paral·lelisme dels algorismes i així poder explotar l'arquitectura vectorial amb més eficiència: Flexibilitat per a declarar diferents classes d'objectes amb diferents estructures i formes d'emmagatzemament. El llenguatge ha de poder expressar les diferents formes d'emmagatzemar les components d'un mateix objecte: per files, columnes, diagonals, etc. Efectivitat per a la manipulació de matrius i vectors dispersos, és a dir, matrius o vectors amb la majoria dels seus elements nuls. Les matrius disperses són molt habituals en problemes reals, per això, el llenguatge de programació ha de poder subministrar els medis per emmagatzemar-les de forma eficient sense ocupar excessiva memòria. Disposar d'operacions vectorials natives que treballin directament amb les estructures de dades anteriorment declarades sense necessitat de bucles. Serà el compilador del llenguatge el que transformi aquestes operacions d'alt nivell en les instruccions vectorials de la màquina. Moltes vegades, el nombre de components del vector declarat en el llenguatge d'alt nivell, serà superior a la capacitat dels registres vectorials. Per això, el compilador haurà d'aplicar la tècnica de seccionament per a descompondre algunes instruccions vectorials d'alt nivell, en unes altres instruccions vectorials més senzilles que puguin executar-se amb la capacitat d'emmagatzemament dels registres vectorials de la màquina. Això no significa, però, que aquests llenguatges no admetin la programació mitjançant bucles. Això és a causa que poden haver moltes operacions combinades que tan sols poden detallar-se mitjançant bucles específics. Evidentment, el llenguatge vectorial no pot tenir com operacions natives totes les possibles combinacions d'operacions vectorials, encara que sí les més freqüents.

Exemple: Cilk Plus.