Procházet zdrojové kódy

Merge branch 'master' of ssh://git.davidventura.com.ar:443/david/orga2-simd

Fabian před 11 roky
rodič
revize
1383731ba8
3 změnil soubory, kde provedl 89 přidání a 9 odebrání
  1. 80 2
      filtros/blur_asm.asm
  2. 7 5
      filtros/blur_c.c
  3. 2 2
      filtros/diff_c.c

+ 80 - 2
filtros/blur_asm.asm

@@ -2,10 +2,19 @@ default rel
 global _blur_asm
 global blur_asm
 
+; Alias para no volverme loco con los registros
+%define src 	rdi
+%define dst 	rsi
+%define cols 	rdx
+%define filas 	rcx
+%define sigma 	xmm0
+%define radius 	r8
 
-section .data
-
+; Algunos defines ultiles
+%define PIXEL_SIZE  4
 
+; Mascaras y esas cosas
+section .data
 
 section .text
 ;void blur_asm    (
@@ -18,6 +27,75 @@ section .text
 
 _blur_asm:
 blur_asm:
+    push rbp
+    mov rbp, rsp                ; Stack frame
+	push r9
+	push r10
+	push r11
+
+.init:
+	mov r9, rdx					;salvo rdx por los mul
+	mov rax, PIXEL_SIZE
+	mul cols
+	mul radius 
+								;rax ahora es cols*pix_size*radius
+	add src, rax				; Avanzo el radius filas (col*pix_size)
+	add dst, rax				; idem
+
+	mov rax, PIXEL_SIZE
+	mul radius					;rax ahora es radius pixeles
+
+	add src, rax				;avanzo radius pixeles (borde)
+	add dst, rax				;idem
+
+	mov cols, r9				;recupero cols  por el mul
+	sub filas, radius			;acomodo filas para ignorar los bordes
+	sub filas, radius			;acomodo filas para ignorar los bordes
+
+	sub cols, rax				;acomodo cols para ignorar los bordes
+
+	mov rax,PIXEL_SIZE 
+	mul cols
+	mov cols, rax 				;cols:=cols*pix_size
+	xor r9,r9
+	xor r10,r10
+.loop:
+    cmp cols, r9              	; Comparo tamaño con el contador
+    jl .finFila                    ; Si ya recorri la imagen voy al final
+    ;movdqu xmm0, [src]          ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
+	pxor xmm0,xmm0
+
+.write:
+    movdqu [dst], xmm0          ; Escribo en el destino
+.endLoop:
+    add src, PIXEL_SIZE * 4     ; Incremento 4 pixeles
+    add dst, PIXEL_SIZE * 4
+    add r9, PIXEL_SIZE * 4
+    jmp .loop
+
+.finFila:
+	inc r10 
+	cmp r10,filas
+	jge .fin
+
+	xor r9,r9
+
+	mov r11, rdx				;salvo rdx
+	mov rax, PIXEL_SIZE
+	mul radius					;rax ahora es radius pixeles
+
+	add src, rax				;agrego radius a la columna inicial
+	add src, rax				;agrego radius a la columna inicial
+	add dst, rax
+	add dst, rax
+
+	mov rdx, r11				;recupero rdx
 
+	jmp .loop
 
+.fin:
+	pop r11
+	pop r10
+	pop r9
+    pop rbp
     ret

+ 7 - 5
filtros/blur_c.c

@@ -4,7 +4,9 @@
 #define M_PI 3.14159265358979323846
 #include "../tp2.h"
 
-
+/**
+* TODO: Sacar de acá y poner adentro de convulción. Lo separe para poder hacer "debagear" mas facil.
+*/
 float gauss(float sigma, int x, int y) {
 	return (1 / (2*M_PI*sigma*sigma)) * exp(- ((x*x)+(y*y))/2*sigma*sigma);
 }
@@ -21,12 +23,12 @@ float* convulcion_matrix(float sigma, int r) {
 	float* conv_matrix = malloc(sizeof(float)*largo);
 
 	// Recorro cada pixel
-	for (int y = 1; y <= largo; y++) {
-		for (int x = 1; x <= largo; x++) {
+	for (int y = -r; y <= r; y++) {
+		for (int x = -r; x <= r; x++) {
 			// Por cada pixel obtengo la sub-matriz de convulsion para cada componente
-			conv_matrix[contador] = gauss(sigma, r - x, r - y); // B
+			conv_matrix[contador] = gauss(sigma, x, y); // B
 			contador++;
-			printf("Sigma: %f | Radio: %d | X: %d | Y: %d | Gauss: %f \n", sigma, r, x, y, gauss(sigma, r-x,r-y));
+			printf("Sigma: %f | Radio: %d | X: %d | Y: %d | Gauss: %f \n", sigma, r, x, y, gauss(sigma, x, y));
 		}
 	}
 	return conv_matrix;

+ 2 - 2
filtros/diff_c.c

@@ -18,8 +18,8 @@ void diff_c (
 	unsigned char (*src_2_matrix)[src_2_row_size] = (unsigned char (*)[src_2_row_size]) src_2;
 	unsigned char (*dst_matrix)[dst_row_size] = (unsigned char (*)[dst_row_size]) dst;
 
-	int i,j,val;
-	printf("%d %d \n", n,m);
+	int i,j;
+	short val;
 
 	for(i=0;i<n;i++){
 		for(j=0;j<m*4;j+=4){