#include #include #include #include #include #include #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" #define MASTER 0 int min = -2, max = 3; typedef struct { int blue; int green; int czerw; }Pixel; int main(int argc, char** argv) { /***** NASZ KOD*****/ int numtasks, taskid; int source; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); MPI_Comm_rank(MPI_COMM_WORLD, &taskid); MPI_Status status; printf("MPI task %d has started... ", taskid); int width, height, channels; unsigned char* img = stbi_load("aa.jpg", &width, &height, &channels, 0); int blur_channels = channels == 4 ? 2 : 1; int licznik = 0; size_t img_size = width * channels * height; int h = height / 3; Pixel* piksele = malloc(sizeof(Pixel) * width * height); //Pixel* tab1 = malloc(sizeof(Pixel) * width * h); //Pixel* tab2 = malloc(sizeof(Pixel) * width * h); //Pixel* tab3 = malloc(sizeof(Pixel) * width * h); int rozmiar = h * width; if (taskid == MASTER) { for (uint8_t* p = img; p != img + img_size; p += channels) { piksele[licznik].czerw = (uint8_t)(*p); piksele[licznik].green = (uint8_t)(*(p + 1)); piksele[licznik].blue = (uint8_t)(*(p + 2)); licznik++; } int tmp = 0; //for (int i = 0; i < h; i++) { // for (int j = 0; j < width; j++) { // tab1[i * width + j] = piksele[i * width + j]; // tab2[i * width + j] = piksele[(i + h) * width + j]; // tab3[i * width + j] = piksele[(i + 2 * h) * width + j]; // tmp++; // } //} //MPI_Send(&rozmiar, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); //MPI_Send(&piksele[rozmiar], h, MPI_CHAR, 1, 0, MPI_COMM_WORLD); for (int i = 1; i < 4; i++) { MPI_Send(&rozmiar, 1, MPI_INT, i, 1, MPI_COMM_WORLD); MPI_Send(&piksele[rozmiar], h*width, MPI_INT, i, 1, MPI_COMM_WORLD); rozmiar = rozmiar + h; } for (int i = 1; i < 4; i++) { source = i; MPI_Recv(&rozmiar, 1, MPI_INT, source, 1, MPI_COMM_WORLD, &status); MPI_Recv(&piksele[rozmiar], h*width, MPI_INT, source, 1, MPI_COMM_WORLD, &status); } } if (taskid > MASTER) { MPI_Recv(&rozmiar, 1, MPI_INT, MASTER, 0, MPI_COMM_WORLD, &status); MPI_Recv(&piksele[rozmiar], h, MPI_CHAR, MASTER, 0, MPI_COMM_WORLD, &status); for (int i = 0; i < h; i++) { for (int j = 0; j < width; j++) { piksele[i * width + j].blue = 100; piksele[i * width + j].green = 150; piksele[i * width + j].czerw = 200; } } MPI_Send(&rozmiar, 1, MPI_INT, MASTER, 0, MPI_COMM_WORLD); MPI_Send(&piksele[rozmiar], h, MPI_CHAR, MASTER, 0, MPI_COMM_WORLD); } MPI_Finalize(); /////////////////////////////////////////////////////////// ///////////////////// /* int width, height, channels; unsigned char *img = stbi_load("potezny.jpg", &width, &height, &channels, 0); if (img == NULL) { printf("Error in loading the image\n"); exit(1); } printf("Loaded image with a width of %dpx, a height of %dpx and %d channels\n", width, height, channels); int blur_channels = channels == 4 ? 2 : 1; int licznik = 0; size_t img_size = width * channels * height; Pixel* piksele = malloc(sizeof(Pixel) * width * height); Pixel* blur = malloc(sizeof(Pixel) * width * height); //Ta pentla daje kolorki do tablicy piksele gdzie wygodnie da sie ich uzywac for (unsigned char* p = img; p != img + img_size; p += channels) { piksele[licznik].czerw = (uint8_t)(*p); piksele[licznik].green = (uint8_t)(*(p + 1)); piksele[licznik].blue = (uint8_t)(*(p + 2)); licznik++; } int rank, n_ranks; int srednia_czerw = 0, srednia_g = 0, srednia_b = 0; int ile_r = 0; int ile_g = 0; int ile_b = 0; // First call MPI_Init MPI_Init(&argc, &argv); // Check that there are two ranks MPI_Comm_size(MPI_COMM_WORLD, &n_ranks); if (n_ranks != 3) { printf("This example requires exactly three ranks\n"); MPI_Finalize(); return(1); } // Get my rank MPI_Comm_rank(MPI_COMM_WORLD, &rank); double start = MPI_Wtime(); if (rank == 0) { for (int y = 0; y < height; y++){ for (int x = 0; x < width; x++){ for (int i = min; i < max; i++){ // przesuwanie w poziomie for (int j = min; j < max; j++){ // przesuwanie w pionie if ((y + i < height && y + i >= 0) && (x + j < width && x + j >= 0)){ srednia_czerw += piksele[(y + i) * width + x + j].czerw; ile_r++; } } } blur[y * width + x].czerw = srednia_czerw / ile_r; ile_r = 0; srednia_czerw = 0; } } //MPI_Send(blur->czerw, 16, MPI_CHAR, 3, 0, MPI_COMM_WORLD); } if (rank == 1) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { for (int i = min; i < max; i++) { // dla y for (int j = min; j < max; j++) { // dla x if ((y + i < height && y + i >= 0) && (x + j < width && x + j >= 0)) { srednia_g += piksele[(y + i) * width + x + j].green; ile_g++; } } } blur[y * width + x].green = srednia_g / ile_g; ile_g = 0; srednia_g = 0; } } MPI_Send(blur->green, 16, MPI_CHAR, 3, 0, MPI_COMM_WORLD); } if (rank == 2) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { for (int i = min; i < max; i++) { // dla y for (int j = min; j < max; j++) { // dla x if ((y + i < height && y + i >= 0) && (x + j < width && x + j >= 0)) { srednia_b += piksele[(y + i) * width + x + j].blue; ile_b++; } } } blur[y * width + x].blue = srednia_b / ile_b; ile_b = 0; srednia_b = 0; } } } double end = MPI_Wtime(); MPI_Finalize(); double czas = end-start; printf("Blur Zrobiony!\n"); printf("Zadanie trwalo: %f [s]\n\n", czas); unsigned char* wynik = malloc(width * height * 3); int index = 0; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { wynik[index++] = (unsigned char)blur[j * width + i].czerw; wynik[index++] = (unsigned char)blur[j * width + i].green; wynik[index++] = (unsigned char)blur[j * width + i].blue; } } stbi_write_jpg("potezny_blur_oddzielnie2.jpg", width, height, 3, wynik, 100); stbi_image_free(img); free(piksele); free(wynik); free(blur); */ }