Suma de vectores con Software Pipelining (Organización del Computador II)
De Cuba-Wiki
Otro ejemplo
Es menos tutorial pero mas ejemplo. Se tienen que sumar los valores de 2 vectores de 10 posiciones y dejar el resultado en otro. Me parecio interesante porque me surgieron mas problemas de los que pense a la hora de cuidar que dato no pisar y hasta cuando mantenerlo vivo. En el codigo hay un diagrama con el valor de los registros en los primeros ciclos. Si alguno encuentra una manera mas eficiente, copese y escribala.
En Orga2 - Software pipelining hay un ejercicio hecho en clase mas completo. Despues de entender este seria interesante ver aquel.
Codigo en C para probar
extern void Sumar(int* v1, int* v2, int* res); int main(int argc, char *argv[]) { int v1[10] = {0,1,2,3,4,5,6,7,8,9}; int v2[10] = {0,10,20,30,40,50,60,70,80,90}; int res[10]; // Suma de los vectores en C for(int i = 0; i < 10; ++i) { res[i] = v1[i] + v2[i]; } printf("Para C: "); for(int i = 0; i < 10; ++i) { printf("%u ", res[i]); } printf("\n"); // Suma de los vectores en IA64 Sumar(v1, v2, res); printf("Para IA64: "); for(int i = 0; i < 10; ++i) { printf("%u ", res[i]); } printf("\n"); return 0; }
Codigo en ASM
.global Sumar .align 32 .section .text .proc Sumar Sumar: alloc r51 = ar.pfs, 3, 17, 0, 16 mov r48 = in0 mov r49 = in1 mov r50 = in2 mov ar.lc = 9 mov ar.ec = 6 mov pr.rot = 1 << 16 ciclo: (p16)ld4 r32 = [r48], 4 //(p17)nop (p18)ld4 r37 = [r49], 4 //(p18)nop (p20)add r40 = r36, r39 (p21)st4 [r50] = r41, 4 br.ctop.sptk.few ciclo // r32 r33 r34 r35 r36 r37 r38 r39 r40 r41 // ----------------------------------------------------------------------------- // v1[0] // v1[1] v1[0] // v1[2] v1[1] v1[0] v2[0] // v1[3] v1[2] v1[1] v1[0] v2[1] v2[0] // v1[4] v1[3] v1[2] v1[1] v1[0] v2[2] v2[1] v2[0] v1[0]+v2[0] // v1[5] v1[4] v1[3] v1[2] v1[1] v2[3] v2[2] v2[1] v1[1]+v2[1] v1[0]+v2[0] mov ar.pfs = r51 br.ret.sptk.many b0 .endp funcionDeIA64