|
|
|
@ -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;
|
|
|
|
|