Proyecto de Enmascadaro de Imagenes con SIMD

Overview

TP 2 - Organización del Computador II

Proyecto de Enmascarado de Imágenes con SIMD

Objetivo

Se debe implementan 2 funciones de Enmascaramiento de imágenes, una función llamada enmascarar_c, integramente en el lenguaje C y otra función llamada enmascarar_asm en lenguaje ensamblador de 32 bits usando instrucciones SIMD, la cual recibe de una aplicación en C los parámetros.
El funcionamiento de las lógicas en los diferentes lenguajes es el mismo, se carga la imagen principal en un buffer, luego la segunda imagen y la mascara en otros 2 buffers distintos y se debe combinar las imágenes 1 y 2 aplicandole un enmascarado. El resultado de esta combinación se guarda en el primer buffer. Además se implementa los programas en C (para ejecutar las funciones en C y en ASM) que reciben los parámetros a utilizar por línea de comandos y llama a las funciones para generar los archivos, salida_c.rgb (ejecución en C) y salida_asm.rgb (Ejecución de ASM) que corresponden a las imágenes producidas por las diferentes funciones.

Ejecución del programa:

El programa compile.sh ejecuta ambas funciones devolviendo las imagenes nuevas generadas. Las imágenes son obtenidas de la carpeta "/Images" y el resultado de los enmascarados son guardados en "/Output"

Pasos de Ejecución Automática

Pasos preeliminares Descargue el archivo y descomprima, ubiquese dentro de la carpeta /MaskWithSIMD

Para ejecutar las pruebas, primero que nada asegurese de ser el superusuario y de darle permisos de ejecucion al archivo "compile.sh"

dar permisos

Abrir carpeta del programa

abra la terminal `ctrl+alt+t`
ingrese el siguiente comando:
sudo ./complie.sh

O ejecute los programas por separados

sudo ./ScriptC.sh
sudo ./ScriptASM.sh

le deberia mostrarle algo asi:

captura1 captura2

  • Los tiempos de ejecución pueden variar de acuerdo al procesador que se esté utilizando.

Para ver el resultado del enmascaramiento dirijase a la carpeta output, y abra alguno de los dos archivos, deberia quedar asi:

imagen resultado

Pasos de Ejecución Manual

Ejecucion Programa enmascarado en C

Para compilar el codigo y generar un nuevo ejecutable se pueden ejecutar los siguientes comandos:

abra la terminal `ctrl +alt+ t`  
sudo gcc -m32 ./Enmascarado_C/enmascarar_c.c -o maskC;

para usar el programa ejecute el siguiente comando:

`./maskC "imagen1.bmp" "imagen2.bmp" "mascara.bmp" alto ancho`

Ejemplo:

  • ./maskC "avengers.bmp" "ligaj.bmp" "mascara.bmp" 1920 1080

Ejecucion Programa enmascarado en ASM

Para compilar el codigo y generar un nuevo ejecutable se pueden ejecutar los siguientes comandos:

abra la terminal `ctrl +alt+ t`  
sudo nasm -f elf32 ./Enmascarado_ASM/enmascarar_asm.asm -o ./Enmascarado_ASM/enmascarar_asm.o;
sudo gcc -m32 ./Enmascarado_ASM/enmascarar_asm.c ./Enmascarado_ASM/enmascarar_asm.o -o maskASM;

para usar el programa ejecute el siguiente comando:

`./maskASM "imagen1.bmp" "imagen2.bmp" "mascara.bmp" alto ancho`

Ejemplo:

  • ./maskASM "avengers.bmp" "ligaj.bmp" "mascara.bmp" 1920 1080

!ATENCION: El alto y el ancho tienen que coincidir con el de las imagenes, de lo contrario la ejecución arrojara un error. observe los resultados en la carpeta output

Ejecución de otras fuentes

si quiere ejecutar el programa con alguna otra imagen de su galeria personal, debe asegurarse de que las imagenes y mascara tengan el mismo tamaño. Coloque las imagenes deseadas en la carpeta image/

Informe

En primera instancia se comenzó por el desarrollo de la aplicación en C, las primeras funcionalidades que se desarrollaron fueran las que se utilizan para abrir las imagenes, para cerrarlas y guardarlas.

abrir imagen

Comenzamos buscando el archivo en la carpeta images, luego lo abrimos, y condicionamos su existencia. Como se puede ver en esta funcion nos apoyamos de una variable largoimg para comparar el tamaño de imagenes y lanzar un error cuando no se pasan imagenes del mismo tamaño.

guardar imagen

Con guardar imagen nos encargamos de guardar el nuevo archivo en una carpeta llamada output.

Luego se continuó con la función de enmascarado en c

enmascarar_c

La lógica de esta funcion es hacer un FOR que recorre la mascara desde el primer al ultimo byte, y si se cruza con un cero no hace nada porque 0 corresponde a negro, si se encuentra un byte distinto de cero pasa el contenido del buffer b al a en la misma posición.

Por último se implemento el código para enmascarar_asm desde el lado de asm

enmascarar_asm

Desde el codigo asm, se implemento una función que hace un loop teniendo en cuenta la cantidad de bytes de la variable local cant (cantidad de pixeles de la imagen), se ejecuta el ciclo y compara un contador con la cantidad para poder salir . En la ejecución de este ciclo guarda los paquetes de a en mm0, b en mm1 y mascara en mm2 y luego hace un AND logico entre la mascara y b (mantiene la imagen b cuando el pixel de la mascara es distinto de negro) y un AND NOT lógico entre la mascara y a (mantiene la imagen a cuando el pixel es distinto de FFFFFF) para finalmente poder hacer on OR lógico en entre las imagenes generadas en mm1 y mm2 (mantiene los valores altos de las 2 imagenes (pisa los blancos y negros), y finalmente cuando se termina el ciclo quedara el enmascarado en mm1.

Por último continuamos con la funcion procesarArchivos que se encarga de llamar a las funciones, asignar buffers a las imagenes (usando malloc), inicializar variables, etc. Para la medición de los tiempos de ejecución la función hace uso de la función clock, <time.h>, que calcula cuanto tiempo le lleva a cada funcion llevar a caboel enmascarado de las imagenes.

Finalizando se separan las aplicaciones para que funcionen independientemente.

PD. el siguiente link fue de mucha ayuda para el enmascarado en assembler

Conclusiones

hicimos 3 pruebas, cada prueba con un tamaño distinto de imagen y mascara y los resultados fueron los siguientes

graficos

link al grafico interactivo. Como se puede observar, la funcion en asm, usando mmx (la extension SIMD de ia32) es mas veloz y eficiente que la programada en C que tarda más, con una diferencia de hasta 5 veces mayor. De esta manera podemos concluir que al usar paralelismo de datos podemos aumentar la velocidad de los procesos.

🌱 Proyecto de agricultura con la implementación de IoT.

Ceres IoT ¿Qué es Ceres IoT? Es un sistema económico de monitoreo de plantas y agricultura en general, que posee un sistema de control de bombeo de ag

Chris Larios 4 May 3, 2022
C++ wrappers for SIMD intrinsics and parallelized, optimized mathematical functions (SSE, AVX, NEON, AVX512)

C++ wrappers for SIMD intrinsics and parallelized, optimized mathematical functions (SSE, AVX, NEON, AVX512)

Xtensor Stack 1.4k Jun 24, 2022
std::find simd version

std::find simd version std::find doesn't use simd intrinsics. ( check https://gms.tf/stdfind-and-memchr-optimizations.html ) So i thought simd can mak

SungJinKang 19 Jan 5, 2022
Do funny things with your DEF CON 29 badge.

DC29 Badge Stuff What's in the repo Funny music code Firmware used (in case of updates) Dumping/flashing the firmware To access firmware: hold down bo

duk 16 Aug 23, 2021
Bateria electronica de 8 instrumentos desarrollada con Arduino

Bateria casera ArduDrum Objetivos: En este proyecto se busca crear un sistema embebido con arduino que a travez del puerto USB o con un traductor de U

marcos rodriguez 1 Oct 25, 2021
Calculadora creada en c++ con Interfaz Grafica

Calculadora Basica Open Source Esta calculadora no es nada del otro mundo, solo Suma, Resta, Multiplica y Divide nada mas pero espero pueden checar el

M01000 2 Nov 7, 2021
Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5"

Raspberry-PI-PICO-display-RPI35 Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5" Con ayuda de la libreria https://github.com/khoih-pr

null 1 Nov 10, 2021
Es una librería aun en desarrollo para la creación de videojuegos con carácters

gamechar Es una librería aun en desarrollo para la creación de videojuegos con carácters La librería trabaja con funciones como ejemplo para imprimir

null 1 Nov 17, 2021
Do funny things with your DEF CON 29 badge.

DC29 Badge Stuff What's in the repo Funny music code Firmware used (in case of updates) Dumping/flashing the firmware To access firmware: hold down bo

duk 16 Aug 23, 2021
L'iconico Button di YouTube rivisitato e reso Smart con un contatore di iscritti in tempo reale!

Smart Youtube Button with Subscribers Counter ESP32 L'iconico Button di Youtube rivisitato e "smartizzato" con un contatore di iscritti in tempo reale

Luca Barsanti 2 Dec 28, 2021
Proyecto indie retro game: para SEGA Mega Drive/Genesis, creado con SGDK

Penguin-World Proyecto indie retro en desarrollo: Plataforma: SEGA Mega Drive/Genesis Que está desarrollado: +Logos + Titulo + Música +Primera Zona de

Alice Sim1 11 May 29, 2022
🌱 Proyecto de agricultura con la implementación de IoT.

Ceres IoT ¿Qué es Ceres IoT? Es un sistema económico de monitoreo de plantas y agricultura en general, que posee un sistema de control de bombeo de ag

Chris Larios 4 May 3, 2022
C++ image processing and machine learning library with using of SIMD: SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX-512, VMX(Altivec) and VSX(Power7), NEON for ARM.

Introduction The Simd Library is a free open source image processing and machine learning library, designed for C and C++ programmers. It provides man

Ihar Yermalayeu 1.6k Jun 24, 2022
P(R*_{3, 0, 1}) specialized SIMD Geometric Algebra Library

Klein ?? ?? Project Site ?? ?? Description Do you need to do any of the following? Quickly? Really quickly even? Projecting points onto lines, lines t

Jeremy Ong 599 Jun 17, 2022
SIMD Vector Classes for C++

You may be interested in switching to std-simd. Features present in Vc 1.4 and not present in std-simd will eventually turn into Vc 2.0, which then de

null 1.2k Jun 23, 2022
Artistic creativity, accelerated with SIMD.

Link the YouTube video demonstration: https://www.youtube.com/watch?v=Bjwml32dxhU The compression algorithm does not work well on this colorful video,

Long Nguyen 17 Mar 16, 2022
C++ wrappers for SIMD intrinsics and parallelized, optimized mathematical functions (SSE, AVX, NEON, AVX512)

C++ wrappers for SIMD intrinsics and parallelized, optimized mathematical functions (SSE, AVX, NEON, AVX512)

Xtensor Stack 1.4k Jun 24, 2022
SIMD (SSE) implementation of the infamous Fast Inverse Square Root algorithm from Quake III Arena.

simd_fastinvsqrt SIMD (SSE) implementation of the infamous Fast Inverse Square Root algorithm from Quake III Arena. Why Why not. How This video explai

Liam 7 Jan 28, 2022
Portable header-only C++ low level SIMD library

libsimdpp libsimdpp is a portable header-only zero-overhead C++ low level SIMD library. The library presents a single interface over SIMD instruction

Povilas Kanapickas 1k Jun 20, 2022
std::find simd version

std::find simd version std::find doesn't use simd intrinsics. ( check https://gms.tf/stdfind-and-memchr-optimizations.html ) So i thought simd can mak

SungJinKang 19 Jan 5, 2022
A small data-oriented and SIMD-optimized 3D rigid body physics library.

nudge Nudge is a small data-oriented and SIMD-optimized 3D rigid body physics library. For more information, see: http://rasmusbarr.github.io/blog/dod

null 231 Jun 10, 2022
Do funny things with your DEF CON 29 badge.

DC29 Badge Stuff What's in the repo Funny music code Firmware used (in case of updates) Dumping/flashing the firmware To access firmware: hold down bo

duk 16 Aug 23, 2021
Bateria electronica de 8 instrumentos desarrollada con Arduino

Bateria casera ArduDrum Objetivos: En este proyecto se busca crear un sistema embebido con arduino que a travez del puerto USB o con un traductor de U

marcos rodriguez 1 Oct 25, 2021
Calculadora creada en c++ con Interfaz Grafica

Calculadora Basica Open Source Esta calculadora no es nada del otro mundo, solo Suma, Resta, Multiplica y Divide nada mas pero espero pueden checar el

M01000 2 Nov 7, 2021
Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5"

Raspberry-PI-PICO-display-RPI35 Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5" Con ayuda de la libreria https://github.com/khoih-pr

null 1 Nov 10, 2021
Implementación de las operaciones con matrices

Matrix Implementación de las operaciones con matrices Sumar dos Matrices Multiplicar dos Matrices Multiplicar una matriz con un escalar Determinante d

Martín Monjaraz Almaraz 1 Nov 17, 2021
Es una librería aun en desarrollo para la creación de videojuegos con carácters

gamechar Es una librería aun en desarrollo para la creación de videojuegos con carácters La librería trabaja con funciones como ejemplo para imprimir

null 1 Nov 17, 2021
Do funny things with your DEF CON 29 badge.

DC29 Badge Stuff What's in the repo Funny music code Firmware used (in case of updates) Dumping/flashing the firmware To access firmware: hold down bo

duk 16 Aug 23, 2021
L'iconico Button di YouTube rivisitato e reso Smart con un contatore di iscritti in tempo reale!

Smart Youtube Button with Subscribers Counter ESP32 L'iconico Button di Youtube rivisitato e "smartizzato" con un contatore di iscritti in tempo reale

Luca Barsanti 2 Dec 28, 2021