void evaluateASTNodeTerm(ASTNode *node){ switch (node->subType) { case TermFactor: /*just clone the result*/ node->mat = cloneMatrix(node->l->mat); break; case TermTimes: node->mat = multiplyMatrix(node->l->mat, node->r->mat); break; case TermDivide: node->mat = divideMatrix(node->l->mat, node->r->mat); break; case TermMod: node->mat = modMatrix(node->l->mat, node->r->mat); break; case TermTurn: node->mat = turnMatrix(node->l->mat); break; default: break; } return; }
int main(int argc, char *argv[]) { int size, rank; int tag = 1234; MPI_Status status; const int rows = 4; const int columns = 2; int matrix[rows][columns]; const int tRows = columns; const int tColumns = rows; // Init MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(size != 3) { printf("Su potrebne prave 3 procesy\n"); return 0; } if(rows % 2 != 0) { printf("Matica musi mat parny pocet riadkov\n"); return 0; } if(rank == 0) { // Generate matrix populateMatrix(rows, columns, matrix); // Print matrix printMatrix(rows, columns, matrix); int firstHalf[rows / 2][columns]; int secondHalf[rows / 2][columns]; divideMatrix(rows, columns, matrix, firstHalf, secondHalf); MPI_Send(firstHalf, (rows / 2) * columns, MPI_INT, 1, tag, MPI_COMM_WORLD); MPI_Send(secondHalf, (rows / 2) * columns, MPI_INT, 2, tag, MPI_COMM_WORLD); int tFirstHalf[tRows][tColumns / 2]; int tSecondHalf[tRows][tColumns / 2]; MPI_Recv(tFirstHalf, tRows * tColumns / 2, MPI_INT, 1, tag, MPI_COMM_WORLD, &status); MPI_Recv(tSecondHalf, tRows * tColumns / 2, MPI_INT, 2, tag, MPI_COMM_WORLD, &status); int tMatrix[tRows][tColumns]; joinMatrices(tRows, tColumns / 2, tMatrix, tFirstHalf, tSecondHalf); printMatrix(tRows, tColumns, tMatrix); } else { int sRows = rows / 2; int sColumns = 2; int subMatrix[sRows][sColumns]; MPI_Recv(subMatrix, sRows * sColumns, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); // Transpose matrix int subTMatrix[sColumns][sRows]; transposeMatrix(sRows, sColumns, subMatrix, subTMatrix); MPI_Send(subTMatrix, sRows * sColumns, MPI_INT, 0, tag, MPI_COMM_WORLD); } // Teardown MPI_Finalize(); // Exit return 0; }