#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 поток, работает ли ваш код?