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?

  1. Validación de parámetros
  • En main.c, se recibe el kernel_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.
  1. Lectura y distribución de archivos
  • main.c abre images/ y construye un arreglo global char 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.
  1. 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.
  1. Interfaz amigable
  • interfaz.py provee botones para:
    1. Seleccionar carpeta de imágenes.
    2. Elegir número de procesos MPI y tamaño de kernel.
    3. Visualizar mensajes de progreso y mostrar —por ejemplo— un log con líneas como [Rank 3] Filtros ligeros procesados: imagen1.bmp.
  1. Salida unificada
  • Todas las imágenes resultantes (grayscale, espejos, blur) se escriben en results/, con nombres generados por funciones como generar_nombre_salida en C (por ejemplo: nombre_grayscale.bmp, nombre_blur_101.bmp).
  • Al finalizar, main.c escribe un archivo results.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ía subprocess) 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)