03_metodología - juanpemedina/transformacion_img-mpi-openmp GitHub Wiki

2. Metodología

Diseño de la Solución

Arquitectura Híbrida:

El sistema aprovecha una combinación de MPI y OpenMP para lograr paralelismo tanto a nivel de nodos como de hilos.

  • MPI se encarga del paralelismo a nivel de procesos. El nodo maestro (proceso con rank 0) gestiona una cola de trabajo (imágenes a procesar) y asigna una imagen por vez a los nodos esclavos mediante mensajes MPI_Send y MPI_Recv, usando etiquetas TAG_WORK y TAG_STOP para controlar el flujo. Esta asignación es dinámica, lo cual permite aprovechar mejor los recursos.

  • OpenMP se utiliza dentro de cada proceso MPI para paralelizar las 6 transformaciones aplicadas a cada imagen. Estas transformaciones se ejecutan en un bucle for marcado con #pragma omp parallel for schedule(dynamic, 1), lo cual divide las transformaciones entre los hilos disponibles en el nodo. Cada hilo procesa una transformación distinta de manera simultánea, sobre una copia independiente de la imagen cargada en memoria. Al final, cada transformación es guardada con su respectivo nombre.

Esta estructura de paralelismo distribuido + multihilo permite escalar horizontalmente más nodos MPI y verticalmente más hilos OpenMP por nodo de forma eficiente.

Código Principal (main_MPI.c)

  • Distribuye imágenes dinámicamente con TAG_WORK / TAG_STOP.
  • Cada proceso llama a process_image() que aplica 6 transformaciones por imagen y guarda los resultados.
  • Métricas escritas con write_metrics() de metrics.h.

Funciones de Procesamiento (image_utils.h)

  • Contiene funciones para: load_image, save_image, to_grayscale, flip_horizontal, flip_vertical, blur, free_image.
    • load_image: Carga una imagen BMP desde disco y la almacena en memoria como una estructura manipulable
    • save_image Guarda una estructura de imagen en disco con formato BMP, conservando cabecera, alineación de filas y formato de 24 bits.
    • to_grayscale Convierte la imagen a escala de grises aplicando una media ponderada sobre los canales RGB para cada píxel.
    • flip_horizontal Refleja horizontalmente la imagen invirtiendo los píxeles de cada fila.
    • flip_vertical Refleja verticalmente la imagen intercambiando las filas de arriba hacia abajo.
    • blur Aplica un desenfoque (blur) promedio utilizando una máscara cuadrada del tamaño indicado (kernel_size), suavizando detalles y bordes.
    • free_image Libera la memoria ocupada por la imagen una vez procesada, evitando fugas de memoria durante ejecución continua.
  • Transformaciones paralelas usando OpenMP.
  • Incluye uso de padding en anchura para alineación eficiente.

Registro de Métricas (metrics.h)

  • write_metrics() guarda por imagen los bytes leídos/escritos.
  • calculate_mips() disponible para análisis de rendimiento si se desea.

Entradas y Salidas

  • Entrada: Carpeta imagenes_bmp/ con imágenes BMP.
  • Salida: Carpeta imagen_transform/ con subcarpetas por imagen, cada una con 6 versiones procesadas.

Condiciones del Experimento

  • Clúster de 3 nodos:

    • PC1: Nodo maestro (Linux local).
    • PC2 y PC3: Nodos esclavos en VirtualBox (Linux Virutalizado).
  • Todos ejecutan Ubuntu Desktop 24.02.

  • Comunicación vía SSH sin contraseña.

  • Archivos compartidos vía NFS montado como /mirror/.