#include "mat_mul.h" #include #include #include #include #include "util.h" #define min(a, b) (((a) < (b)) ? (a) : (b)) #define MASTER 0 #define FORM_MASTER 1 #define FORM_WORKER 2 static float *A, *B, *C; static int M, N, K; static int num_threads; static int mpi_rank, mpi_world_size; static int rows[4]={0,}; static int offset[4]={0,}; #define SLICEM 32 #define SLICEK 16 #define SLICEN 2048 static void mat_mul_omp() { // TODO: parallelize & optimize matrix multiplication // Use num_threads per node // #pragma omp parallel for // for (int i = 0; i < rows; ++i) { // for (int j = 0; j < N; ++j) { // for (int k = 0; k < K; ++k) { // C[i * N + j] += A[i * K + k] * B[k * N + j]; // } // } // } // #pragma omp parallel num_threads(num_threads) // #pragma omp parallel for // for (int i = 0; i < rows; ++i) { // for (int k = 0; k < K; ++k) { // float arr = A[i*K+k]; // for (int j = 0; j < N; j+=1) { // C[i * N + j] += arr * B[k * N + j]; // } // } // } int start=0; int ed=rows[mpi_rank]; #pragma omp parallel for num_threads(num_threads) schedule(dynamic) for(int i2=start;i2 MASTER) // // { // // mtype = FORM_MASTER; // // // MPI_Recv(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); // // // MPI_Recv(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); // // // MPI_Recv(&A, rows*N, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status); // // // MPI_Recv(B, N*K, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status); // // printf("///////////////// mpi_rank Number %d\n",mpi_rank); // // printf("///////////////// Worker Recv offset %d\n",offset); // // printf("///////////////// Worker Recv rows %d\n",rows); // // printf("///////////////// Worker Recv A rows*N %d\n",rows*N); // // printf("///////////////// Worker Recv B N*K %d\n",N*K); // // printf("///////////////// ------------------------------\n"); // // mat_mul_omp(); // // mtype = FORM_WORKER; // // // MPI_Send(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD); // // // MPI_Send(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD); // // // MPI_Send(&C, N, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD); // // printf("///////////////// mpi_rank Number %d\n",mpi_rank); // // printf("///////////////// Worker Send offset %d\n",offset); // // printf("///////////////// Worker Send rows %d\n",rows); // // printf("///////////////// Worker Send C N %d\n",N); // // printf("///////////////// ------------------------------\n"); // // }