Metología - LFelipe06/act_integradora_TC3003B GitHub Wiki
El diseño metodológico del sistema se fundamenta en la integración de componentes distribuidos y paralelos para maximizar la eficiencia del procesamiento de imágenes. La solución se ejecuta en un clúster de tres computadoras conectadas a través de una red local, configuradas bajo un esquema maestro-esclavo. Un nodo actúa como controlador central (master), mientras que los otros dos nodos (slaves) ejecutan tareas de procesamiento asignadas de forma remota.
Diseño de la solución
El flujo operativo inicia con el usuario accediendo a la interfaz gráfica del sistema. Esta GUI, construida con PyQt5, permite seleccionar una carpeta de imágenes BMP y definir los efectos deseados. Al confirmar la configuración, se genera un archivo config.txt
que contiene los parámetros de ejecución: cantidad de imágenes a procesar, tipo de efectos seleccionados y, en su caso, el tamaño del kernel de desenfoque.
A continuación, se lanza la ejecución del binario principal (tester
), previamente compilado en lenguaje C y enlazado con MPI y OpenMP. Este programa lee la configuración, divide la lista de imágenes y asigna a cada uno de los tres procesos (un proceso por nodo) un subconjunto del total. La comunicación entre procesos se lleva a cabo mediante MPI, coordinando la asignación de tareas y el envío de resultados.
Dentro de cada nodo, se activa la paralelización interna a través de OpenMP, distribuyendo la carga de cada imagen entre múltiples hilos. Esta combinación de paralelismo a nivel de hilos (intra-nodo) y procesos (inter-nodo) permite maximizar el aprovechamiento de los recursos computacionales disponibles.
Ejemplo de ejecución paralela
omp_set_num_threads(18);
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
if (cfg.gray_flip_h && myrank == 0) {
for (int i = block1_start; i <= block1_end; i++) {
...
inv_img_grey_horizontal(out_file, in_file);
}
}
...
}
}
Lectura de configuración
Esta función toma el archivo config.txt
generado por la GUI y lo traduce a una estructura Config
usada durante la ejecución.
int parse_config(Config *cfg, const char *filename) {
FILE *file = fopen(filename, "r");
if (!file) return 0;
...
else if (strcmp(key, "total_imgs") == 0) cfg->total_imgs = atoi(value);
...
}
El sistema asume que todos los nodos del clúster están conectados correctamente por red, que tienen montado el directorio compartido mediante NFS, y que las claves SSH permiten ejecución remota sin intervención del usuario. Asimismo, los nodos deben contar con las bibliotecas necesarias para ejecutar código OpenMP y MPI, así como con acceso de escritura al sistema de archivos compartido.
Funciones principales de procesamiento de imagen
El sistema implementa seis funciones principales para la transformación de imágenes BMP. A continuación se describen con su operación clave:
gray_img
)
1. Escala de grises (Convierte una imagen RGB a escala de grises mediante ponderación perceptual.
pixel = 0.21 * r + 0.72 * g + 0.07 * b;
2. Inversión horizontal en escala de grises (inv_img_grey_horizontal)
Voltea horizontalmente una imagen en escala de grises, procesando el arreglo en orden inverso.
fputc(arr_in[(ancho * alto) - i - 1], outputImage);
3. Inversión vertical en escala de grises (inv_img_grey_vertical)
Refleja verticalmente una imagen en escala de grises invirtiendo las posiciones horizontales por fila.
int flipped_pos = y * ancho + (ancho - 1 - x);
fputc(arr_in[flipped_pos], outputImage);
4. Inversión horizontal en color (inv_img_color_horizontal)
Voltea horizontalmente una imagen RGB, separando y procesando cada canal por separado.
fputc(arr_in_b[(ancho * alto) - i - 1], outputImage);
fputc(arr_in_g[(ancho * alto) - i - 1], outputImage);
fputc(arr_in_r[(ancho * alto) - i - 1], outputImage);
5. Inversión vertical en color (inv_img_color_vertical)
Refleja una imagen RGB en el eje vertical, reorganizando cada canal en base a su posición horizontal.
int flipped_pos = y * ancho + (ancho - 1 - x);
fputc(arr_in_b[flipped_pos], outputImage);
fputc(arr_in_g[flipped_pos], outputImage);
fputc(arr_in_r[flipped_pos], outputImage);
6. Desenfoque (desenfoque)
Aplica un desenfoque a la imagen en dos etapas (horizontal y vertical), usando un kernel cuadrado.
// Desenfoque horizontal
sumB += input_rows[y][idx + 0];
// Desenfoque vertical
sumB += temp_rows[ny][idx + 0];
Salidas esperadas
El sistema genera como salida las imágenes procesadas, que se almacenan en la carpeta img_res/
, accesible por todos los nodos. Además, se produce un archivo de log output_log.txt
que contiene información detallada sobre el rendimiento del procesamiento:
- Tiempo total de ejecución
- Número estimado de instrucciones ejecutadas
- MIPS alcanzados
- Tasa de procesamiento en bytes por segundo
Durante la ejecución, se generan también archivos de progreso por nodo (progress0.txt
, progress1.txt
, etc.) que permiten a la interfaz gráfica mostrar el estado del sistema en tiempo real.
La metodología propuesta garantiza la reproducibilidad, la distribución balanceada del trabajo y una mejora sustancial en los tiempos de procesamiento respecto a soluciones secuenciales.