Predicació (arquitectura d'ordinadors)

De la Viquipèdia, l'enciclopèdia lliure

En l'arquitectura d'ordinadors, la predicació és una característica que proporciona una alternativa a la transferència condicional de control, tal com s'implementa per les instruccions de la màquina de branca condicional. La predicció funciona tenint instruccions condicionals (predicades ) no ramificades associades a un predicat, un valor booleà utilitzat per la instrucció per controlar si la instrucció pot modificar l'estat arquitectònic o no. Si el predicat especificat a la instrucció és cert, la instrucció modifica l'estat arquitectònic; en cas contrari, l'estat arquitectònic no es modifica. Per exemple, una instrucció de moviment predicat (un moviment condicional) només modificarà la destinació si el predicat és cert. Així, en comptes d'utilitzar una branca condicional per seleccionar una instrucció o una seqüència d'instruccions a executar en funció del predicat que controla si es produeix la branca, les instruccions a executar s'associen a aquest predicat, de manera que s'executaran o no. executat, en funció de si aquest predicat és vertader o fals.[1]

Els processadors vectorials, alguns SIMD ISA (com AVX2 i AVX-512) i les GPU en general fan un gran ús de la predicació, aplicant un bit d'un vector de màscara condicional als elements corresponents en els registres vectorials que s'estan processant, mentre que la predicació escalar en la instrucció escalar els conjunts només necessiten un bit de predicat. Quan les màscares de predicats es tornen especialment potents en el processament vectorial és si una matriu de codis de condició, un per element vectorial, pot retroalimentar-se a màscares de predicats que després s'apliquen a instruccions vectorials posteriors.[2]

Visió general[modifica]

La majoria de programes informàtics contenen codi condicional, que només s'executarà en condicions específiques en funció de factors que no es poden determinar prèviament, per exemple, segons l'entrada de l'usuari. Com que la majoria dels processadors simplement executen la següent instrucció en una seqüència, la solució tradicional és inserir instruccions de branca que permetin a un programa ramificar condicionalment a una secció diferent de codi, canviant així el següent pas de la seqüència. Això va ser suficient fins que els dissenyadors van començar a millorar el rendiment mitjançant la implementació de la canalització d'instruccions, un mètode que es veu alentit per les branques. Per obtenir una descripció més completa dels problemes que van sorgir i una solució popular, vegeu el predictor de branques.

Afortunadament, un dels patrons de codi més comuns que normalment es basa en la ramificació té una solució més elegant. Considereu el següent pseudocodi: [3]

if condition
  {dosomething}
else
  {dosomethingelse}

En un sistema que utilitza ramificació condicional, això podria traduir-se en instruccions de màquina semblants a: [4]

branch-if-condition to label1
dosomethingelse
branch-to label2
label1:
dosomething
label2:
...

Amb la predicació, tots els camins de branca possibles es codifiquen en línia, però algunes instruccions s'executen mentre que altres no. La idea bàsica és que cada instrucció està associada a un predicat (la paraula aquí s'utilitza de manera similar al seu ús en la lògica de predicats) i que la instrucció només s'executarà si el predicat és cert. El codi màquina de l'exemple anterior que utilitza predicació podria semblar a això: [5]

(condition) dosomething
(not condition) dosomethingelse

A més d'eliminar ramificacions, es necessita menys codi en total, sempre que l'arquitectura proporcioni instruccions predicades. Tot i que això no garanteix una execució més ràpida en general, sí que ho farà si els blocs de codi de dosomething i dosomethingelse són prou curts.

La forma més senzilla de la predicció és la predicació parcial, on l'arquitectura té instruccions de moviment condicional o de selecció condicional. Les instruccions de moviment condicional escriuen el contingut d'un registre sobre un altre només si el valor del predicat és cert, mentre que les instruccions de selecció condicionals trien quin dels dos registres té el seu contingut escrit en un tercer en funció del valor del predicat. Una forma més generalitzada i capaç és la predicació completa. La predicació completa té un conjunt de registres de predicats per emmagatzemar predicats (que permet eliminar simultàniament múltiples branques imbricades o seqüencials) i la majoria de les instruccions de l'arquitectura tenen un camp especificador de registre per especificar quin registre de predicats proporciona el predicat.

Referències[modifica]

  1. Rick Vinyard. «Predication» (en anglès). cs.nmsu.edu, 26-04-2000. [Consulta: 22 abril 2014].
  2. «[https://www.eecs.harvard.edu/cs146-246/cs146-lecture12.pdf Computer Science 146 Computer Architecture]» (en anglès). [Consulta: 14 novembre 2023].
  3. Rick Vinyard. «Predication» (en anglès). cs.nmsu.edu, 26-04-2000. [Consulta: 22 abril 2014].
  4. Rick Vinyard. «Predication» (en anglès). cs.nmsu.edu, 26-04-2000. [Consulta: 22 abril 2014].
  5. Rick Vinyard. «Predication» (en anglès). cs.nmsu.edu, 26-04-2000. [Consulta: 22 abril 2014].