#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define MASTER_RANK 0
#define BLUR_RADIUS 1
// Function to blur a pixel
void blurPixel(unsigned char *image, int width, int x, int y) {
int sum = 0;
int count = 0;
for (int i = x - BLUR_RADIUS; i <= x + BLUR_RADIUS; i++) {
for (int j = y - BLUR_RADIUS; j <= y + BLUR_RADIUS; j++) {
if (i >= 0 && i < width && j >= 0 && j < width) {
sum += image[i * width + j];
count++;
}
}
}
image[x * width + y] = (unsigned char)(sum / count);
}
// Function to blur a block of the image
void blurBlock(unsigned char *block, int width, int block_size) {
for (int i = 0; i < block_size; i++) {
for (int j = 0; j < block_size; j++) {
blurPixel(block, width, i, j);
}
}
}
int main(int argc, char *argv[]) {
int rank, size;
int image_size = 512;
int block_size = 64;
int num_blocks = image_size / block_size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Check if number of processes is valid
if (size != num_blocks * num_blocks) {
if (rank == MASTER_RANK) {
printf("Number of processes must equal the number of image blocks\n"); }
MPI_Finalize();
return EXIT_FAILURE;
}
// Generate image data on the master process
unsigned char *image = NULL;
if (rank == MASTER_RANK) {
image
= (unsigned char *)malloc(image_size
* image_size
* sizeof(unsigned char)); // Initialize image with random data
for (int i = 0; i < image_size * image_size; i++) {
}
}
// Scatter image blocks to processes
unsigned char *block
= (unsigned char *)malloc(block_size
* block_size
* sizeof(unsigned char)); MPI_Scatter(image, block_size * block_size, MPI_UNSIGNED_CHAR, block, block_size * block_size, MPI_UNSIGNED_CHAR, MASTER_RANK, MPI_COMM_WORLD);
// Process the block
blurBlock(block, block_size, block_size);
// Gather processed blocks back to master process
MPI_Gather(block, block_size * block_size, MPI_UNSIGNED_CHAR, image, block_size * block_size, MPI_UNSIGNED_CHAR, MASTER_RANK, MPI_COMM_WORLD);
// Print the processed image
if (rank == MASTER_RANK) {
for (int i = 0; i < image_size; i++) {
for (int j = 0; j < image_size; j++) {
printf("%3d ", image
[i
* image_size
+ j
]); }
}
}
// Cleanup
MPI_Finalize();
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKI2RlZmluZSBNQVNURVJfUkFOSyAwCiNkZWZpbmUgQkxVUl9SQURJVVMgMQoKLy8gRnVuY3Rpb24gdG8gYmx1ciBhIHBpeGVsCnZvaWQgYmx1clBpeGVsKHVuc2lnbmVkIGNoYXIgKmltYWdlLCBpbnQgd2lkdGgsIGludCB4LCBpbnQgeSkgewogICAgaW50IHN1bSA9IDA7CiAgICBpbnQgY291bnQgPSAwOwogICAgZm9yIChpbnQgaSA9IHggLSBCTFVSX1JBRElVUzsgaSA8PSB4ICsgQkxVUl9SQURJVVM7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSB5IC0gQkxVUl9SQURJVVM7IGogPD0geSArIEJMVVJfUkFESVVTOyBqKyspIHsKICAgICAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDwgd2lkdGggJiYgaiA+PSAwICYmIGogPCB3aWR0aCkgewogICAgICAgICAgICAgICAgc3VtICs9IGltYWdlW2kgKiB3aWR0aCArIGpdOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGltYWdlW3ggKiB3aWR0aCArIHldID0gKHVuc2lnbmVkIGNoYXIpKHN1bSAvIGNvdW50KTsKfQoKLy8gRnVuY3Rpb24gdG8gYmx1ciBhIGJsb2NrIG9mIHRoZSBpbWFnZQp2b2lkIGJsdXJCbG9jayh1bnNpZ25lZCBjaGFyICpibG9jaywgaW50IHdpZHRoLCBpbnQgYmxvY2tfc2l6ZSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJsb2NrX3NpemU7IGorKykgewogICAgICAgICAgICBibHVyUGl4ZWwoYmxvY2ssIHdpZHRoLCBpLCBqKTsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIGludCByYW5rLCBzaXplOwogICAgaW50IGltYWdlX3NpemUgPSA1MTI7CiAgICBpbnQgYmxvY2tfc2l6ZSA9IDY0OwogICAgaW50IG51bV9ibG9ja3MgPSBpbWFnZV9zaXplIC8gYmxvY2tfc2l6ZTsKCiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnNpemUpOwoKICAgIC8vIENoZWNrIGlmIG51bWJlciBvZiBwcm9jZXNzZXMgaXMgdmFsaWQKICAgIGlmIChzaXplICE9IG51bV9ibG9ja3MgKiBudW1fYmxvY2tzKSB7CiAgICAgICAgaWYgKHJhbmsgPT0gTUFTVEVSX1JBTkspIHsKICAgICAgICAgICAgcHJpbnRmKCJOdW1iZXIgb2YgcHJvY2Vzc2VzIG11c3QgZXF1YWwgdGhlIG51bWJlciBvZiBpbWFnZSBibG9ja3NcbiIpOwogICAgICAgIH0KICAgICAgICBNUElfRmluYWxpemUoKTsKICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgfQoKICAgIC8vIEdlbmVyYXRlIGltYWdlIGRhdGEgb24gdGhlIG1hc3RlciBwcm9jZXNzCiAgICB1bnNpZ25lZCBjaGFyICppbWFnZSA9IE5VTEw7CiAgICBpZiAocmFuayA9PSBNQVNURVJfUkFOSykgewogICAgICAgIGltYWdlID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoaW1hZ2Vfc2l6ZSAqIGltYWdlX3NpemUgKiBzaXplb2YodW5zaWduZWQgY2hhcikpOwogICAgICAgIC8vIEluaXRpYWxpemUgaW1hZ2Ugd2l0aCByYW5kb20gZGF0YQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2Vfc2l6ZSAqIGltYWdlX3NpemU7IGkrKykgewogICAgICAgICAgICBpbWFnZVtpXSA9IHJhbmQoKSAlIDI1NjsKICAgICAgICB9CiAgICB9CgogICAgLy8gU2NhdHRlciBpbWFnZSBibG9ja3MgdG8gcHJvY2Vzc2VzCiAgICB1bnNpZ25lZCBjaGFyICpibG9jayA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKGJsb2NrX3NpemUgKiBibG9ja19zaXplICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKICAgIE1QSV9TY2F0dGVyKGltYWdlLCBibG9ja19zaXplICogYmxvY2tfc2l6ZSwgTVBJX1VOU0lHTkVEX0NIQVIsIGJsb2NrLCBibG9ja19zaXplICogYmxvY2tfc2l6ZSwgTVBJX1VOU0lHTkVEX0NIQVIsIE1BU1RFUl9SQU5LLCBNUElfQ09NTV9XT1JMRCk7CgogICAgLy8gUHJvY2VzcyB0aGUgYmxvY2sKICAgIGJsdXJCbG9jayhibG9jaywgYmxvY2tfc2l6ZSwgYmxvY2tfc2l6ZSk7CgogICAgLy8gR2F0aGVyIHByb2Nlc3NlZCBibG9ja3MgYmFjayB0byBtYXN0ZXIgcHJvY2VzcwogICAgTVBJX0dhdGhlcihibG9jaywgYmxvY2tfc2l6ZSAqIGJsb2NrX3NpemUsIE1QSV9VTlNJR05FRF9DSEFSLCBpbWFnZSwgYmxvY2tfc2l6ZSAqIGJsb2NrX3NpemUsIE1QSV9VTlNJR05FRF9DSEFSLCBNQVNURVJfUkFOSywgTVBJX0NPTU1fV09STEQpOwoKICAgIC8vIFByaW50IHRoZSBwcm9jZXNzZWQgaW1hZ2UKICAgIGlmIChyYW5rID09IE1BU1RFUl9SQU5LKSB7CiAgICAgICAgcHJpbnRmKCJQcm9jZXNzZWQgSW1hZ2U6XG4iKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltYWdlX3NpemU7IGkrKykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGltYWdlX3NpemU7IGorKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlM2QgIiwgaW1hZ2VbaSAqIGltYWdlX3NpemUgKyBqXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBDbGVhbnVwCiAgICBmcmVlKGltYWdlKTsKICAgIGZyZWUoYmxvY2spOwogICAgTVBJX0ZpbmFsaXplKCk7CgogICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQo=