diff --git a/assignment3.c b/assignment3.c index 63c8d11..38d7bce 100644 --- a/assignment3.c +++ b/assignment3.c @@ -1,7 +1,9 @@ #include "common.h" -#define INPUTFILE1 "assignment3.in1" -#define INPUTFILE2 "assignment3.in2" +//#define INPUTFILE1 "assignment3.in1" +//#define INPUTFILE2 "assignment3.in2" +#define INPUTFILE1 "a.in" +#define INPUTFILE2 "b.in" #define DIM_COUNT1 0 #define DIM_COUNT2 1 @@ -30,7 +32,7 @@ int main(int argc, char *argv[]) { arrDimensions[DIM_ROWS1] = arrDimensions[DIM_COUNT1] / arrDimensions[DIM_COLS1]; arrDimensions[DIM_ROWS2] = arrDimensions[DIM_COUNT2] / arrDimensions[DIM_COLS2]; - if (arrDimensions[DIM_ROWS1] != arrDimensions[DIM_ROWS2]) { + if (arrDimensions[DIM_COLS1] != arrDimensions[DIM_COLS2]) { printf("Matrices cannot be multiplied! Check dimensions.\n"); exit(EXIT_FAILURE); } @@ -45,24 +47,60 @@ int main(int argc, char *argv[]) { } - //MPI_Bcast(arrDimensions, NUM_DIMS, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(arrDimensions, NUM_DIMS, MPI_INT, 0, MPI_COMM_WORLD); - //int *arrSlice1 = my_malloc(arrDimensions[DIM_COUNT1] * sizeof(int)); - //MPI_Scatterv(arrMatrix1, arrBlockSizes, arrBlockIndices, MPI_INT, arrSlice1, arrDimensions[DIM_COUNT1], MPI_INT, 0, MPI_COMM_WORLD); + int *arrSlice1 = my_malloc(arrDimensions[DIM_COUNT1] * sizeof(int)); + MPI_Scatterv(arrMatrix1, arrBlockSizes, arrBlockIndices, MPI_INT, arrSlice1, arrDimensions[DIM_COUNT1], MPI_INT, 0, MPI_COMM_WORLD); - //int *arrSlice2 = my_malloc(arrDimensions[DIM_COUNT2] * sizeof(int)); - //MPI_Scatterv(arrMatrix2, arrBlockSizes, arrBlockIndices, MPI_INT, arrSlice2, arrDimensions[DIM_COUNT2], MPI_INT, 0, MPI_COMM_WORLD); - ////MPI_Bcast(&arrDimensions[DIM_COUNT2], 1, MPI_INT, 0, MPI_COMM_WORLD); - ////MPI_Bcast(&numCols2, 1, MPI_INT, 0, MPI_COMM_WORLD); + int *arrSlice2 = my_malloc(arrDimensions[DIM_COUNT2] * sizeof(int)); + MPI_Scatterv(arrMatrix2, arrBlockSizes, arrBlockIndices, MPI_INT, arrSlice2, arrDimensions[DIM_COUNT2], MPI_INT, 0, MPI_COMM_WORLD); + //MPI_Bcast(&arrDimensions[DIM_COUNT2], 1, MPI_INT, 0, MPI_COMM_WORLD); + //MPI_Bcast(&numCols2, 1, MPI_INT, 0, MPI_COMM_WORLD); - //int arrBlockData[NUM_CODES]; - //MPI_Recv(arrBlockData, NUM_CODES, MPI_INT, 0, 1, MPI_COMM_WORLD, &status); - ////printf("rank %d, size %d, indices %d\n", numRank, arrBlockData[CODE_SIZE], arrBlockData[CODE_INDEX]); - ////printf("nc1 %d, nc2 %d\n", arrDimensions[DIM_COUNT1], arrDimensions[DIM_COUNT2]); + int arrBlockData[NUM_CODES]; + MPI_Recv(arrBlockData, NUM_CODES, MPI_INT, 0, 1, MPI_COMM_WORLD, &status); + //printf("rank %d, size %d, indices %d\n", numRank, arrBlockData[CODE_SIZE], arrBlockData[CODE_INDEX]); + //printf("nc1 %d, nc2 %d\n", arrDimensions[DIM_COUNT1], arrDimensions[DIM_COUNT2]); //for (int i = 0; i < arrBlockData[CODE_SIZE]; i++) { - //printf("rank %d, slice1[%d] = %d\n", numRank, i, arrSlice1[i]); + //printf("s: 1, r: %2d, [%d] = %d\n", numRank, i, arrSlice1[i]); //} + //for (int i = 0; i < arrBlockData[CODE_SIZE]; i++) { + //printf("s: 2, r: %2d, [%d] = %d\n", numRank, i, arrSlice2[i]); + //} + + //for (int i = 0; i < NUM_DIMS; i++) + //printf("%6d (%d)\n", arrDimensions[i], i); + + int sum = 0; + int col = 0; + for (int row = 0; row < arrDimensions[DIM_ROWS2]; row++) { + col = row * arrDimensions[DIM_COLS2]; + for (int i = 0; i < arrBlockData[CODE_SIZE]; i++) { + sum += arrSlice1[i] * arrSlice2[col]; + //printf("%2d[%d%d]\n", sum, i, col); + col++; + if (col == (row + 1) * arrDimensions[DIM_COLS2]) { + printf("%3d ", sum); + col = row * arrDimensions[DIM_COLS2]; + sum = 0; + } + } + printf("\n"); + } + +/* + for (int j = 0; j < 2; j++) { + //sum += (arrSlice1[i] * arrSlice2[j]); + //if (j % arrDimensions[DIM_COLS1] == 0) { + ////printf("%4d (%d);", sum, numRank); + //printf("%4d; ", sum); + //sum = 0; + //} + //printf("%4d; ", sum); + printf("%2d[%d%d]\t", i, j, arrSlice1[i] * arrSlice2[i]); + } +*/ ////We can calculate arrDimensions[DIM_ROWS2] * numCols2 = numCount2 //int arrDimensions[DIM_ROWS2] = numCount2 / numCols2; diff --git a/assignment3.in2 b/assignment3.in2 index ad25a13..52b2521 100644 --- a/assignment3.in2 +++ b/assignment3.in2 @@ -1,5 +1,5 @@ -1 2 3 -4 5 6 -7 8 9 -10 11 12 -13 14 15 +16 17 18 +19 29 21 +22 23 24 +25 26 27 +28 29 30 diff --git a/common.c b/common.c index 6c1d753..a31b8cc 100644 --- a/common.c +++ b/common.c @@ -77,7 +77,7 @@ void spread_evenly(int numProcesses, int numCount, int multiplier, int **arrBloc arrBlockData[CODE_SIZE] = numBlockSize; arrBlockData[CODE_INDEX] = numBlockIndex; - printf("size[%d] = %d\tindex[%d] = %d\n", i, numBlockSize, i, numBlockIndex); + //printf("size[%d] = %d\tindex[%d] = %d\n", i, numBlockSize, i, numBlockIndex); (*arrBlockIndices)[i] = numBlockIndex; numBlockIndex += numBlockSize;