#include #include #include #include //#include "serial.h" #define D 64 //float ** matrix; float matrix[D][D]; void createAndInitMatrix() { int i = 0, j = 0; /* matrix = (float **) malloc(D * sizeof(float *)); if (matrix == NULL) { printf("NULL\n"); return; } int i = 0, j = 0; for (i = 0; i < D; i++) { matrix[i] = (float *) malloc(D * sizeof(float)); if (matrix == NULL) { printf("NULL in for 2\n"); return; } } */ for (i = 0; i < D; i++) { for (j = 0; j < D; j++) { matrix[i][j] = i * j; //matrix[i][j] = (float) sqrt(i * j); //printf("%7.3f | ", array[i][j]); } //printf("\n"); } } int main(int argc, char** argv) { //serial_calculator(); MPI_Init(NULL, NULL); int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size < 2) { fprintf(stderr, "World size must be greater than 0 for %s\n", argv[0]); MPI_Abort(MPI_COMM_WORLD, 1); } //float matrix_recieve2[D][D]; //temporary buffer matrix //int number; //Initialize matrix in master and scat it if (world_rank == 0) { createAndInitMatrix(); //MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); } // int row = 0; int send_count = (int) (D / (world_size - 1)); //e.g 64/2 = 32 int receive_count = send_count; for (row = 0; row < D; row++) { float matrix_recieve[D]; //temporary buffer matrix //printf("before scatter %d = \n", world_rank); MPI_Scatter(matrix[row], send_count, MPI_FLOAT, matrix_recieve, receive_count, MPI_FLOAT, 0, MPI_COMM_WORLD); //printf("after scatter %d = \n", world_rank); if (world_rank != 0) { int col = 0; /*for (col = ((world_rank - 1) * (send_count)); col < ((world_rank) * (send_count)); col++) { matrix_recieve[row] = sqrtf(col * row); }*/ for(col=0; col < send_count; col++) { //printf("%7.2f|", matrix_recieve[row]); matrix_recieve[col] = (float)sqrtf(matrix_recieve[col]); //matrix_recieve[row] = (float)sqrt(); } } MPI_Gather(matrix_recieve, send_count, MPI_FLOAT, matrix[row], receive_count, MPI_FLOAT, 0, MPI_COMM_WORLD); //print result in master } if (world_rank == 0) { int row2 = 0, col2 = 0; for (row2 = 0; row2 < D; row2++) { for (col2 = 0; col2 < D; col2++) { printf("%7.2f|", matrix[row2][col2]); } printf("\n"); } } //MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //free(matrix); MPI_Finalize(); return 0; }