Diferencia entre revisiones de «Instrucciones de pipelining (Organización del Computador II)»

De Cuba-Wiki
Sin resumen de edición
Sin resumen de edición
Línea 2: Línea 2:


  extern int funcionDeIA64(int*,int*);
  extern int funcionDeIA64(int*,int*);
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
  {
  {
Línea 26: Línea 25:
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í:
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
  ;.global funcionDeIA64


  .section .text
  ;.section .text;


  .align 32
  ;.align 32;


  .proc funcionDeIA64
  .proc funcionDeIA64;


  funcionDeIA64:
  funcionDeIA64:;


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

Revisión del 08:34 14 nov 2006

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: