Diferencia entre revisiones de «Instrucciones de pipelining (Organización del Computador II)»
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 a_porC[10]; | |||
int a_porIA64[10]; | |||
int i; | |||
int a_porIA64[10]; | |||
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í: | |||
//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 | |||
//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: | |||
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 | |||
La inicialización y el bucle para cexit es: | |||
mov ar.ec = 3 | |||
mov ar.lc = 10 | |||
mov pr.rot = 1<<16 | |||
ciclo: | |||
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 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: | |||
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: | fin: | ||
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: