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 1: Línea 1:
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):
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*);
  extern int funcionDeIA64(int*,int*);  
  int main(int argc, char *argv[])
  {
  int main(int argc, char *argv[])  
     int a[10] = {0,1,2,3,4,5,6,7,8,9};
  {  
     int a_porC[10];
     int a[10] = {0,1,2,3,4,5,6,7,8,9};  
    int i;
     int a_porC[10];  
    for(i = 0; i<10;i++){
     int a_porIA64[10];  
      a_porC[i] = a[i] * 2;
     int i;  
    }     
     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í:
    for(i = 0; i<10;i++){
      a_porC[i] = a[i] * 2;
    }


;.global funcionDeIA64
    printf("\nproceso interno: %d\n", funcionDeIA64(a,a_porIA64));
    printf("\nresultado correcto:\n");  


;.section .text;
    for(i = 0; i<10;i++){
      printf("%d,", a_porC[i]);
    }


;.align 32;
    printf("\n\nresultado programa:\n");  


.proc funcionDeIA64;
    for(i = 0; i<10;i++){
      printf("%d,", a_porIA64[i]);
    }


  funcionDeIA64:;
    printf("\n\n");
}
   


alloc r20 = ar.pfs,2,6,0,8
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í:


  //loc0 = a
.global funcionDeIA64
  //loc1 = a_porIA64              
.section .text
 
  (aca va la inicialización y el bucle)
.align 32
 
 
  mov ar.pfs = r20
.proc funcionDeIA64
  br.ret.sptk.many b0
 
funcionDeIA64:
  .endp funcionDeIA64
 
alloc r20 = ar.pfs,2,6,0,8
La inicialización y el bucle para ctop es:
  //loc0 = a  
  //loc1 = a_porIA64  
 
mov r21 = in0
mov r22 = in1
mov r23 = 2
  (aca va la inicialización y el bucle)  
  mov ar.pfs = r20  
  br.ret.sptk.many b0  
  .endp funcionDeIA64  


mov ar.ec = 3
La inicialización y el bucle para ctop es:
mov ar.lc = 9
mov pr.rot = 1<<16


  ciclo:
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


(p16) ld4 r32 = [r21],4
La inicialización y el bucle para cexit es:
(p17) pmpy2.r r33 = r33,r23
(p18) st4 [r22] = r34,4


  br.ctop.sptk.few ciclo
  mov ar.ec = 3
mov ar.lc = 10
mov pr.rot = 1<<16


La inicialización y el bucle para cexit es:
  ciclo:  
 
mov ar.ec = 3
mov ar.lc = 10
mov pr.rot = 1<<16
 
  ciclo:
    
    
  br.cexit.sptk.few fin
  br.cexit.sptk.few fin  


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


  br.cond.sptk.few ciclo
  br.cond.sptk.few ciclo  
    
    
  fin:
  fin:  
 
La inicialización y el bucle para wexit es:


mov r24 = 0
La inicialización y el bucle para wexit es:
mov r25 = 10


  mov pr.rot = 0
mov r24 = 0
  mov ar.ec = 3
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:


ciclo:
La inicialización y el bucle para wtop es:  
 
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


mov r24 = 0
mov r25 = 10
mov pr.rot = 1<<17
mov ar.ec = 3
ciclo:
add r24 = r24,r0,1
(p17) ld4 r32 = [r21],4
(p18) pmpy2.r r33 = r33,r23
(p19) st4 [r22] = r34,4
 
cmp.lt p16,p2 = r24,r25
(p16) br.wtop.sptk.few ciclo
  fin:
  fin:
La inicialización y el bucle para wtop es:

Revisión del 03:01 15 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 a_porIA64[10]; 
   int i; 
   for(i = 0; i<10;i++){ 
     a_porC[i] = a[i] * 2; 
   } 
   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 
  
mov r21 = in0 
mov r22 = in1 
mov r23 = 2 

(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:

mov r24 = 0 
mov r25 = 10 

mov pr.rot = 1<<17 
mov ar.ec = 3 

ciclo: 

add r24 = r24,r0,1 

(p17) ld4 r32 = [r21],4 
(p18) pmpy2.r r33 = r33,r23 
(p19) st4 [r22] = r34,4 
  
cmp.lt p16,p2 = r24,r25 
(p16) br.wtop.sptk.few ciclo 

fin: