Suma de vectores con Software Pipelining (Organización del Computador II)

De Cuba-Wiki

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