Descripción - vanech20/evaluacionfinal GitHub Wiki
Descripción
¿Qué se va a hacer?
Este proyecto implementa un sistema de procesamiento de imágenes en paralelo sobre un clúster de computadoras (nodos) usando MPI (Message Passing Interface) y OpenMP.
El objetivo principal es aplicar distintos filtros (ligeros y de desenfoque) a un conjunto de imágenes BMP en forma eficiente, distribuyendo la carga de trabajo entre un proceso maestro y varios procesos ayudantes, y aprovechando el paralelismo en cada nodo mediante secciones OpenMP.
Herramientas que se emplearán
- Lenguaje C (compilador GCC).
- MPI (mpich o OpenMPI) para comunicación entre procesos en distintos nodos.
- OpenMP para paralelismo de threads dentro de cada proceso.
- Funciones propias de procesamiento de imágenes (en
image_processing.h
/image_processing.c
), que incluyen operaciones como:- Conversión a escala de grises
- Reflejo horizontal y vertical (color y escala de grises)
- Desenfoque (blur) con kernel de tamaño configurable
- Estructura de carpetas:
images/
→ carpeta de entrada que contiene las imágenes.bmp
results/
→ carpeta destino donde se guardan las imágenes procesadas
¿Qué elementos garantizan los resultados esperados?
- Validación de parámetros
- En
main.c
, se recibe elkernel_blur
desde línea de comandos, y se valida que sea impar y esté entre 55 y 155. - En la parte Python, la GUI también verifica que los campos ingresados por el usuario cumplan rangos válidos antes de llamar al ejecutable en C.
- Lectura y distribución de archivos
main.c
abreimages/
y construye un arreglo globalchar archivos_global[MAX_ARCHIVOS][100]
con las rutas de cada BMP.- Luego difunde por todo
MPI_COMM_WORLD
tanto el kernel como la lista de imágenes.
- Sincronización y paralelismo
- MPI: el proceso
rank=0
(maestro) reparte tareas a los ayudantes (ranks ≥ 1). - OpenMP: dentro de cada proceso, hay secciones paralelas (
#pragma omp parallel sections
) para aplicar filtros ligeros en 5 hilos simultáneos. Para el blur, se usan bucles#pragma omp parallel for
. - Locks (
omp_lock_t lock_ligeros
,lock_blur
) y secciones críticas (#pragma omp critical
) garantizan que cada hilo/proceso obtenga un índice distinto al asignar imágenes, evitando condiciones de carrera.
- Interfaz amigable
interfaz.py
provee botones para:- Seleccionar carpeta de imágenes.
- Elegir número de procesos MPI y tamaño de kernel.
- Visualizar mensajes de progreso y mostrar —por ejemplo— un log con líneas como
[Rank 3] Filtros ligeros procesados: imagen1.bmp
.
- Salida unificada
- Todas las imágenes resultantes (grayscale, espejos, blur) se escriben en
results/
, con nombres generados por funciones comogenerar_nombre_salida
en C (por ejemplo:nombre_grayscale.bmp
,nombre_blur_101.bmp
). - Al finalizar,
main.c
escribe un archivoresults.txt
con métricas (tiempo total, número de bytes procesados, MIPS estimados, MB/s, etc.). - La parte Python puede leer ese
results.txt
y mostrarlo en la ventana de la GUI.
Con toda esta arquitectura, se asegura que:
-
No haya solapamiento de trabajo (cada imagen se procesa una sola vez).
-
El usuario pueda verificar rápidamente, en la carpeta
results/
, que cada operación (grayscale, mirrorh, mirrorv, blur) se aplicó correctamente. -
El paralelismo distribuido reduzca significativamente el tiempo total de procesamiento.
-
Python 3.x
main.py
: script de orquestación que invoca (víasubprocess
) el ejecutable generado por la parte en C, recopila parámetros y muestra resultados.interfaz.py
: GUI desarrollada con PyQt5 (o Flask, según versión) para que el usuario seleccione carpeta de imágenes, especifique parámetros de ejecución y vea mensajes de progreso.
-
Estructura de carpetas (en el repositorio)