From 13f6786a139e44db8bb2009b0160eea906b91ead Mon Sep 17 00:00:00 2001 From: norangebit Date: Fri, 19 Mar 2021 18:50:59 +0100 Subject: [PATCH] general fixes --- main.c | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/main.c b/main.c index db3f2f6..fd791a5 100644 --- a/main.c +++ b/main.c @@ -18,8 +18,10 @@ int main() { int rank, size, private_text_len, text_len, pattern_len; int *text_piece; int *match_numbers; + int *total_matches; + int total_match_number; int *displacements; - int remain; + int remain = 0; char *pattern, *text; MPI_Init(NULL, NULL); @@ -57,7 +59,13 @@ int main() { MPI_COMM_WORLD); private_text[private_text_len] = '\0'; + if (rank == MASTER) + MPI_Send(&remain, 1, MPI_INT, size - 1, DEFAULT_TAG, MPI_COMM_WORLD); + else if (rank == size -1) + MPI_Recv(&remain, 1, MPI_INT, MASTER, DEFAULT_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("%d -> input: %s\n", rank, private_text); + printf("%d -> text len:%d\n", rank, private_text_len); MPI_Bcast(&pattern_len, 1, MPI_INT, MASTER, MPI_COMM_WORLD); @@ -85,7 +93,9 @@ int main() { find_end(residue, pattern, private_text, &matches, &match_number); } - int shift = rank * private_text_len; + print_array(matches, match_number); + + int shift = rank * (private_text_len - remain); apply_shift(shift, matches, match_number); printf("%d -> result number: %d\n", rank, match_number); @@ -97,41 +107,27 @@ int main() { MPI_Gather(&match_number, 1, MPI_INT, match_numbers, 1, MPI_INT, MASTER, MPI_COMM_WORLD); if (rank == MASTER) { - match_number = sum_array(match_numbers, size); - matches = (int *) realloc(matches, sizeof(int) * match_number); + total_match_number = sum_array(match_numbers, size); - int offset = 0; - for (int i = 0; i < size; ++i) { - if (i == MASTER) { - offset += match_numbers[i]; - continue; - } - - MPI_Recv(matches + offset, match_numbers[i], MPI_INT, i, DEFAULT_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - offset += match_numbers[i]; + total_matches = (int *) malloc(sizeof(int) * total_match_number); + displacements[0] = 0; + for (int i = 0; i < size - 1; ++i) { + displacements[i + 1] = displacements[i] + match_numbers[i]; } - } else { - MPI_Send(matches, match_number, MPI_INT, MASTER, DEFAULT_TAG, MPI_COMM_WORLD); } + MPI_Gatherv(matches, match_number, MPI_INT, total_matches, match_numbers, displacements, MPI_INT, MASTER, + MPI_COMM_WORLD); + MPI_Finalize(); if (rank == MASTER) { - printf("total matches: %d\n", match_number); + printf("total matches: %d\n", total_match_number); printf("matches index: "); - print_array(matches, match_number); + print_array(total_matches, total_match_number); } } -char *read_text(int *len) { - return read_file("data/text.txt", len); -} - -char *read_pattern() { - // TODO - return "mamma"; -} - void find_end(int residue, char *pattern, char *text, int **matches, int *match_number) { int pattern_index = residue; int text_index = 0;