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.
Trabalho desenvolvido na disciplina de Computação Paralela — Engenharia de Computação, Universidade Federal de Pelotas (UFPel).
- Visão Geral
- Arquitetura da Solução Híbrida (Master-Worker)
- Modelagem Matemática e Paralelismo
- Métricas de Desempenho e Profiling
- Estrutura do Repositório
- Compilação e Execução
- Autor
- Licença
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:
- MPI (Nível de Nó): Gerencia a distribuição e coleta fatiada de matrizes de pixels via comunicação coletiva (
MPI_ScattereMPI_Gather). - OpenMP (Nível de Núcleo): Gerencia a computação multithread em memória compartilhada em cada nó via diretivas
#pragma omp parallel for.
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
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
#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;
}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
.ppmbruto no Mestre e gravação em disco.
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
- Compilador de C (
gccouclang) - Biblioteca OpenMPI / MPICH
- Suporte a OpenMP (
-fopenmp)
Utilize o Makefile incluído para compilar o executável com suporte híbrido:
makePara executar a aplicação distribuída (exemplo utilizando 4 processos MPI):
mpirun -n 4 ./execApós a execução, o programa exibirá no terminal a tabela de métricas de tempo e salvará o arquivo resultante saida.ppm.
João Vitor Kauer Schuck
Engenharia de Computação — Universidade Federal de Pelotas (UFPel)
Distribuído sob a licença MIT.