Skip to content

Latest commit

 

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Processamento Híbrido de Imagens em C (MPI + OpenMP)

Filtro paralelo de conversão de imagens para escala de cinza (Grayscale) utilizando arquitetura híbrida de alto desempenho: MPI (Message Passing Interface) para comunicação entre nós de cluster e OpenMP (Open Multi-Processing) para processamento multithread em memória compartilhada.

Language: C Parallel Computing Image Format License: MIT

Trabalho desenvolvido na disciplina de Computação Paralela — Engenharia de Computação, Universidade Federal de Pelotas (UFPel).


Sumário


Visão Geral

O processamento digital de imagens de altíssima resolução exige alta capacidade computacional e largura de banda de memória. Em ambientes de computação distribuída (clusters de alto desempenho), os nós de processamento frequentemente não compartilham a mesma memória física nem o mesmo sistema de arquivos.

Este projeto resolve o gargalo de I/O de disco e otimiza a comunicação em rede através de um pipeline híbrido MPI + OpenMP:

  1. MPI (Nível de Nó): Gerencia a distribuição e coleta fatiada de matrizes de pixels via comunicação coletiva (MPI_Scatter e MPI_Gather).
  2. OpenMP (Nível de Núcleo): Gerencia a computação multithread em memória compartilhada em cada nó via diretivas #pragma omp parallel for.

Arquitetura da Solução Híbrida (Master-Worker)

flowchart TD
    DISK[(Arquivo de Imagem PPM ufpel.ppm)] -->|Leitura I/O| MESTRE[Processo Mestre - Rank 0]
    
    subgraph MPI_LAYER["Camada de Distribuição Distribuída (MPI)"]
        MESTRE -->|MPI_Bcast: Altura / Largura| WORKERS[Todos os Nós MPI]
        MESTRE -->|MPI_Scatter: Fatias de Pixels 1D| W1[Nó 0]
        MESTRE -->|MPI_Scatter| W2[Nó 1]
        MESTRE -->|MPI_Scatter| W3[Nó 2]
        MESTRE -->|MPI_Scatter| W4[Nó n]
    end

    subgraph OMP_LAYER["Camada de Processamento Multithread (OpenMP)"]
        W1 -->|omp parallel for| T1[Thread 1..k]
        W2 -->|omp parallel for| T2[Thread 1..k]
        W3 -->|omp parallel for| T3[Thread 1..k]
        W4 -->|omp parallel for| T4[Thread 1..k]
    end

    subgraph REAGRUPAMENTO["Reagrupamento & Gravacao"]
        T1 & T2 & T3 & T4 -->|MPI_Gather: Matriz Processada| MESTRE
        MESTRE -->|Escrita I/O| OUT[(Imagem de Saida dita.ppm)]
    end
Loading

Modelagem Matemática e Paralelismo

A conversão da matriz de pixels RGB (24-bit) para tom de cinza é classificada na literatura de HPC como um problema embaraçosamente paralelo (embarrassingly parallel). Uma vez que o cálculo de intensidade de cada pixel $p_i = (R_i, G_i, B_i)$ depende unicamente dos seus próprios canais de cor, elimina-se a necessidade de trocas de fronteira (ghost cells) durante a computação:

$$\text{Luminosidade}_i = \left\lfloor \frac{R_i + G_i + B_i}{3} \right\rfloor$$

#pragma omp parallel for
for (int i = 0; i < pixels_por_processo; i++) {
    int media = (meu_pedaco[i].r + meu_pedaco[i].g + meu_pedaco[i].b) / 3;
    meu_pedaco[i].r = media;
    meu_pedaco[i].g = media;
    meu_pedaco[i].b = media;
}

Métricas de Desempenho e Profiling

A medição de tempo de execução é realizada utilizando rotinas de alta precisão MPI_Wtime(), separando o gargalo de I/O do ganho real de computação paralela:

  • Tempo de Computação/Rede: Medido do momento da distribuição coletiva (MPI_Scatter), execução multithread OpenMP até o recolhimento (MPI_Gather).
  • Tempo Total (com I/O): Medição completa incluindo a leitura do arquivo .ppm bruto no Mestre e gravação em disco.

Estrutura do Repositório

image-processing-mpi-openmp/
├── main.c           # Pipeline principal (MPI_Scatter, OpenMP, MPI_Gather e métricas)
├── ppm.c            # Leitor e gravador de imagens no formato PPM Binário (P6)
├── ppm.h            # Estruturas de dados (Pixel, Image) e protótipos de funções
├── Makefile         # Script de compilação automatizada com mpicc e OpenMP
├── ufpel.ppm        # Imagem de teste de alta resolução
├── LICENSE
└── README.md

Compilação e Execução

Pré-requisitos

  • Compilador de C (gcc ou clang)
  • Biblioteca OpenMPI / MPICH
  • Suporte a OpenMP (-fopenmp)

1. Compilação

Utilize o Makefile incluído para compilar o executável com suporte híbrido:

make

2. Execução Híbrida

Para executar a aplicação distribuída (exemplo utilizando 4 processos MPI):

mpirun -n 4 ./exec

Após a execução, o programa exibirá no terminal a tabela de métricas de tempo e salvará o arquivo resultante saida.ppm.


Autor

João Vitor Kauer Schuck
Engenharia de Computação — Universidade Federal de Pelotas (UFPel)

GitHub: jvkauer


Licença

Distribuído sob a licença MIT.

About

Filtro de processamento de imagens de alta performance em C com arquitetura paralela híbrida MPI + OpenMP.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages