Instrucciones de pipelining (Organización del Computador II)

De Cuba-Wiki
Revisión del 08:28 14 nov 2006 de 201.255.15.141 (discusión)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

Aclaro que el problema a resolver es muy sencillo, la idea solamente es ver en funcionamiento las instrucciones. Para el caso de wtop y wexit su uso es solamente ilustrativo, es decir, el programa funciona correctamente pero si la guarda del bucle esta relacionada solamente con el número de iteraciones conviene usar directamente ctop y cexit. Volviendo al problema, este consta de duplicar el valor de los elementos de un vector A y poner el resultado en otro vector B, ambos de 10 posiciones. A continuación el programa en C (no le presten atención a lo que devuelve la función, la única razón de ser que tiene es el debugging):

extern int funcionDeIA64(int*,int*);

int main(int argc, char *argv[]) {

  int a[10] = {0,1,2,3,4,5,6,7,8,9};
  int a_porC[10];
  int i;
  for(i = 0; i<10;i++){
    a_porC[i] = a[i] * 2;
  }      
  int a_porIA64[10];
  printf("\nproceso interno: %d\n", funcionDeIA64(a,a_porIA64));
  printf("\nresultado correcto:\n");
  for(i = 0; i<10;i++){
    printf("%d,", a_porC[i]);
  }
  printf("\n\nresultado programa:\n");
  for(i = 0; i<10;i++){
    printf("%d,", a_porIA64[i]);
  }
  printf("\n\n");

}

El programa en IA64 es siempre el mismo salvo la inicializacion de ar.lc y ar.ec (ademas de registros auxiliares que se podrian llegar a usar) y el bucle en sí:

.global funcionDeIA64

.section .text

.align 32

.proc funcionDeIA64

funcionDeIA64:

alloc r20 = ar.pfs,2,6,0,8

//loc0 = a //loc1 = a_porIA64

(aca va la inicialización y el bucle)

mov ar.pfs = r20 br.ret.sptk.many b0

.endp funcionDeIA64

La inicialización y el bucle para ctop es:

mov ar.ec = 3 mov ar.lc = 9 mov pr.rot = 1<<16

ciclo:

(p16) ld4 r32 = [r21],4 (p17) pmpy2.r r33 = r33,r23 (p18) st4 [r22] = r34,4

br.ctop.sptk.few ciclo

La inicialización y el bucle para cexit es:

mov ar.ec = 3 mov ar.lc = 10 mov pr.rot = 1<<16

ciclo:

br.cexit.sptk.few fin

(p17) ld4 r32 = [r21],4 (p18) pmpy2.r r33 = r33,r23 (p19) st4 [r22] = r34,4

br.cond.sptk.few ciclo

fin:

La inicialización y el bucle para wexit es:

mov r24 = 0 mov r25 = 10

mov pr.rot = 0 mov ar.ec = 3

ciclo:

cmp.lt p16,p2 = r24,r25 (p16) br.wexit.sptk.few fin

(p17) ld4 r32 = [r21],4 (p18) pmpy2.r r33 = r33,r23 (p19) st4 [r22] = r34,4

add r24 = r24,r0,1 br.cond.sptk.few ciclo

fin:

La inicialización y el bucle para wtop es: