Diferencia entre revisiones de «Rotación de Registros y Software Pipelining (Organización del Computador II)»

De Cuba-Wiki
(SI hay links aca también se torna dificil de mantener, ir a la página de orga2 para ver los links de soft pipe)
(Sin diferencias)

Revisión del 03:54 15 nov 2006

La cantidad de registros generales que rotan se definen en el 4to parametros del alloc. Los registros de punto flotante rotan todos a partir del f32, y los de predicado a partir del p16. La cantidad de registros generales que se rota debe ser múltiplo de 8.

Los registros generales que rotan son a partir del r32, siempre que se quiera salvar un valor para que se pueda acceder siempre con el mismo registro, se ubica en un reg lo suficientemente alto como para que no lo agarre la rotación, como ser r40 si se rotan 8.

Se rota el valor de r32 a r33, r33 a r34, etc. O sea, se mapea el r34 al r33, el r33 a r32, el e32 al r39, etc. La mayor dificultad del tema es qué registros elegir para rotar e identificarlos con qué valor en la función.

La instrucción para hacer el loop y rotar los registros una posición es br.ctop; chequear el manual por más instrucciones que actúan distinto cuando se anula el loop counter.

Contador de epílogo, ar.ec, indica qué se hace al final del loop; por ahora dejarlo en 1, en software pipelining se verá más en detalle.

Ejercicio

Siendo los 3 primeros valores 0 1 y 1, obtener el n-esimo valor de

F(n) = F(n-3) * F(n-1) + F(n-2)

Usando rotación de registros, se puede identificar esa cuenta con

r32 = (r35 * r33) + r34

El valor de F(n) se pasa a F(n-1) para la siguiente iteración, y así sucesivamente.

Codigo:

alloc r40 = ar.pfs, 1, 8, 0, 8	 //Rota 8 registros

mov r33 = 1	    //Inicializo
mov r34 = 1
mov r35 = 0

mov ar.ec = 1	    //Seteo epilogo

sub r32 = r32, 2   //Seteo loop counter considerando que tengo los valores de 0 a 2
mov ar.lc = r32

ciclo:
  
  pmpy2.r r32 = r35, r33    //Opero, el pmpy restringe a valores muy pequeños de n
  add r32 = r32, r34
  
  br.ctop.hints ciclo ;;    //Loopeo y roto
  
mov r8 = r33		     //El resultado queda en r33

  

Se podrian haber usado registros de float directamente, siendo que tambien rotan, para aprovechar la operacion de multiplicacion xmpy.