Сглаживание изображений в MPI с использованием Scatter и Gather

#mpi

#mpi

Вопрос:

Здравствуйте, у меня есть задача в MPI. В этой задаче я буду реализовывать алгоритм параллельной обработки изображений. Этот алгоритм вычисляет среднее значение каждого пикселя и его восьми соседей. Вы можете представить изображение как 2-мерный массив значений цвета, то есть матрицу, алгоритм сглаживания может быть применен ко всем значениям этой матрицы, то есть пикселям изображения.

На рисунке ниже показан процесс смягчения средней точки и является средним значением для 8 соседних точек после смягчения. Сглаживание 3×3 (20 40 10 10 20 20 10 20 30)/9 = 20

Моя программа применяет алгоритм сглаживания к входному изображению, а затем сохраняет результаты в новом изображении. Итак, мне нужно написать последовательную программу program.c, которая принимает два ввода; первый для имени входного изображения, а второй для имени выходного изображения. Этот раздел не обязательно должен включать какую-либо параллельную обработку.

У меня есть две библиотеки для чтения и записи: <stb_image.h> и <stb_image_write.h>

задача mpcc.c -lm -o task_mpi

./task_mpi -n 2 input.jpg output.jpg

Я попытался немного поработать над программой, но не смог добиться плодотворного прогресса.

Mycode:

     #include <stdint.h>
#include <stdio.h>
#include <mpi.h>
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

#include "stb_image.h"
#include "stb_image_write.h"
#define CHANNEL_NUM 1


    int main(int argc,char* argv[]) {
        int width, height, bpp, total,rgb;
        MPI_Init(NULL,NULL);
        int id ;
        int size;
        MPI_Comm_rank(MPI_COMM_WORLD,amp;id);
        MPI_Comm_size(MPI_COMM_WORLD,amp;size);
        int *img_mpi;
        int local_image = (height/3)*width / size;
        int* recv_buf = (int*) malloc(sizeof(int)*local_image);
        int full_image[height*width];
        // Reading the image
        uint8_t* rgb_image = stbi_load(argv[1], amp;width, amp;height, amp;bpp, CHANNEL_NUM);
        
        printf("Width: %d  Height: %d n",width,height);
    
        for(int ii = 0; ii < height*width;ii  )
        {
            full_image[ii]=amp;rgb_image[ii];
        }
        
        MPI_Scatter(full_image, local_image ,MPI_INT, amp;recv_buf,local_image, MPI_INT, 1, MPI_COMM_WORLD);
    
        if(id == 1)
        {
            for(int i=1;i<height;i  )
            {
                for(int j=1;j<width;j  )
                {           
                    total = 
                            recv_buf,[(i-1)*width  (j-1)]   
                            recv_buf,[(i-1)*width  j]    
                            recv_buf,[(i-1)*width  (j 1)]   
                            recv_buf,[(i)*width  (j-1)]   
                            recv_buf,[i*width   j]    
                            recv_buf,[(i)*width  (j 1)]   
                            recv_buf,[(i 1)*width  (j-1)]   
                            recv_buf,[(i 1)*width  j]    
                            recv_buf,[(i 1)*width  (j 1)];
                    rgb = (total / 9);
                    recv_buf[i*width   j]= rgb;         
                }
            } 
        }
        MPI_Gather(amp;recv_buf, local_image ,MPI_INT, full_image, local_image, MPI_INT, 0, MPI_COMM_WORLD);
         
        if(id == 0)
        {
            
                rgb_image = amp;recv_buf;
            
        }
        
        // Stoing the image 
        stbi_write_jpg(argv[2], width, height, CHANNEL_NUM, rgb_image, 100);
        stbi_image_free(rgb_image);
        MPI_Finalize();
        return 0;
    }
 

Комментарии:

1. Пожалуйста, помогите мне…

2. MPI_Gather() является коллективной операцией и, следовательно, должна вызываться всеми званиями коммуникатора. При этом я не понимаю, почему вы выдаете gather сразу после прочтения изображения. В любом случае, если вы застряли, предоставьте подробное объяснение того, где вы находитесь, что работает, а что не работает.

3. На самом деле я не уверен, где использовать эту функцию. Я только что попробовал кое-что.

4. Почему MPI_Comm_rank будет равен 0 или 1? и все, похоже, сохраняют изображение.

5. Я не запускал ваш код, если вы используете 1 поток, работает ли ваш код?