From 0f23d58632d8c4a1b359187827de758b03c82076 Mon Sep 17 00:00:00 2001 From: NFELIV <57617133+NFELIV@users.noreply.github.com> Date: Wed, 11 Mar 2020 19:50:23 +0300 Subject: [PATCH 1/2] =?UTF-8?q?13.=20=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BC=D0=B0=D1=82=D1=80=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..4a9a309 --- /dev/null +++ b/main.cpp @@ -0,0 +1,100 @@ +#include "mpi.h" +#include +#include "locale" + + +int MaxSearch(const int* vector, const int n) // +{ + int max; + if (n == 0) + { + return INT_MAX; + } + max = vector[0]; + for (int i = 0; i < n; i++) + { + if (max < vector[i]) + { + max = vector[i]; + } + } + return max; +} + +void OutputMatrix(const int* matrix, const int n, const int m) +{ + for (int i = 0; i < n; i++) + { + for (int j = 0; j < m; j++) + { + printf("%d ", matrix[i * m + j]); + } + printf("\n"); + } +} + +int main(int argc, char* argv[]) +{ + setlocale(LC_ALL, "Russian"); + if (argc != 3) + { + printf("Usage: %s, n, m \n", argv[0]); + printf("n - rows\n"); + printf("m - columns\n"); + return 1; + } + int* matrix = 0; + int n, m; + int max; + int proc_num, proc_rank; + int *send_counts, *displs, *recieve_buffer; + int chunk_size, rem; + double start, end; + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &proc_num); + MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank); + n = atoi(argv[1]); + m = atoi(argv[2]); + if (proc_rank == 0) // + { + matrix = new int[n * m]; + srand(5); + for (int i = 0; i < n * m; i++) + { + matrix[i] = rand(); + } + if ((n < 10) && (m < 10)) + { + OutputMatrix(matrix, n, m); + } + } + start = MPI_Wtime(); + send_counts = new int[proc_num]; + displs = new int[proc_num]; + chunk_size = n * m / proc_num; + rem = n * m % proc_num; + send_counts[0] = chunk_size + rem; + displs[0] = chunk_size + rem; + for (int i = 0; i < proc_num; i++) + { + send_counts[i] = chunk_size; + displs[i] = rem + i * chunk_size; + } + recieve_buffer = new int[send_counts[proc_rank]]; + MPI_Scatterv(matrix, send_counts, displs, MPI_INT, recieve_buffer, send_counts[proc_rank], MPI_INT, 0, MPI_COMM_WORLD); + max = MaxSearch(recieve_buffer, send_counts[proc_rank]); + int GlobMax = 0; + MPI_Reduce(&max, &GlobMax, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); + if (proc_rank == 0) + { + end = MPI_Wtime(); + printf("max= %d\n", GlobMax); + printf("Time spent: %lf\n", end - start); + delete matrix; + } + MPI_Finalize(); + delete[] send_counts; + delete[] displs; + delete[] recieve_buffer; + return 0; +} From c34fa7ea84912adb705df9cb8f4623641cc086cc Mon Sep 17 00:00:00 2001 From: NFELIV <57617133+NFELIV@users.noreply.github.com> Date: Wed, 25 Mar 2020 13:14:04 +0300 Subject: [PATCH 2/2] Update[finale] main.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправил, финал --- main.cpp | 131 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 78 insertions(+), 53 deletions(-) diff --git a/main.cpp b/main.cpp index 4a9a309..de19181 100644 --- a/main.cpp +++ b/main.cpp @@ -2,8 +2,9 @@ #include #include "locale" +#define MaxMatrixSizeForPrintToScreen 10 -int MaxSearch(const int* vector, const int n) // +int MaxSearch(const int* vector, const int n) // Поиск максимума в векторе, n { int max; if (n == 0) @@ -21,80 +22,104 @@ return max; } -void OutputMatrix(const int* matrix, const int n, const int m) +void OutputMatrix(const int* matrix, const int n, const int m) // Вывод матрицы на экран { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { - printf("%d ", matrix[i * m + j]); + printf("%7d ", matrix[i * m + j]); } printf("\n"); } + printf("\n"); } -int main(int argc, char* argv[]) +void FillMatrix(int* matrix, const int n, const int m) // Заполнение матрицы { - setlocale(LC_ALL, "Russian"); - if (argc != 3) + srand((int)time(NULL)); + for (int i = 0; i < n * m; i++) { - printf("Usage: %s, n, m \n", argv[0]); - printf("n - rows\n"); - printf("m - columns\n"); - return 1; + matrix[i] = (int)rand(); } - int* matrix = 0; - int n, m; - int max; - int proc_num, proc_rank; - int *send_counts, *displs, *recieve_buffer; - int chunk_size, rem; - double start, end; +} + +int main(int argc, char* argv[]) +{ + int msN, msM; // размеры матрицы + int *matrix = 0; // указатель на массив, описывающий матриц + int max; // максимальное значение в матрице + int proc_num, proc_rank; // переменные для хранения ранга этого процесса и количества процессов + int *send_counts; // указатель на массив, описывающий, сколько элементов нужно отправить в каждый процесс + int *displs; // указатель на массив, описывающий смещения, с которых начинается каждый сегмент + int *recieve_buffer; // указатель на буфер, в котором должны храниться полученные данные + int chunk_size; // количество элементов в полном куске данных + int rem; // количество элементов, оставшиеся после разделения между процессами + double start_time; // время начала + double end_time; // время окончания + int GlobMax = 0; // переменная для сбора MAXимума + const int root = 0; // корневой процесс root MPI_Init(&argc, &argv); - MPI_Comm_size(MPI_COMM_WORLD, &proc_num); - MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank); - n = atoi(argv[1]); - m = atoi(argv[2]); - if (proc_rank == 0) // + MPI_Comm_size(MPI_COMM_WORLD, &proc_num); // количество процессов + MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank); // ранг процесса + if (argc == 3) { - matrix = new int[n * m]; - srand(5); - for (int i = 0; i < n * m; i++) + msN = atoi(argv[1]); + msM = atoi(argv[2]); + if (proc_rank == root) { - matrix[i] = rand(); + matrix = new int[msN * msM]; + FillMatrix(matrix, msN, msM); + if ((msN < MaxMatrixSizeForPrintToScreen) && (msM < MaxMatrixSizeForPrintToScreen)) + { + printf("\nThe Generated Matrix %dx%d:\n\n", msN, msM); + OutputMatrix(matrix, msN, msM); + } } - if ((n < 10) && (m < 10)) + start_time = MPI_Wtime(); + send_counts = new int[proc_num]; + displs = new int[proc_num]; + chunk_size = (int)(msN * msM) / proc_num; + rem = (msN * msM) % proc_num; + if (chunk_size == 0) { - OutputMatrix(matrix, n, m); + chunk_size = 1; + rem = 0; } + send_counts[0] = chunk_size + rem; + displs[0] = 0; + for (int i = 1; i < proc_num; i++) + { + send_counts[i] = chunk_size; + displs[i] = i * chunk_size + rem; + } + recieve_buffer = new int[send_counts[proc_rank]]; + MPI_Scatterv(matrix, send_counts, displs, MPI_INT, recieve_buffer, send_counts[proc_rank], MPI_INT, root, MPI_COMM_WORLD); + max = MaxSearch(recieve_buffer, send_counts[proc_rank]); + MPI_Reduce(&max, &GlobMax, 1, MPI_INT, MPI_MAX, root, MPI_COMM_WORLD); + if (proc_rank == root) + { + end_time = MPI_Wtime(); + printf("Max elem. = %7d\n\n", GlobMax); + printf("Number of elem. in a full piece of data = %3d\n", chunk_size); + printf("Number of elem. remaining after separation between processes = %3d\n", rem); + printf("Time spent: %lf\n", end_time - start_time); + delete matrix; + } + delete[] send_counts; + delete[] displs; + delete[] recieve_buffer; } - start = MPI_Wtime(); - send_counts = new int[proc_num]; - displs = new int[proc_num]; - chunk_size = n * m / proc_num; - rem = n * m % proc_num; - send_counts[0] = chunk_size + rem; - displs[0] = chunk_size + rem; - for (int i = 0; i < proc_num; i++) - { - send_counts[i] = chunk_size; - displs[i] = rem + i * chunk_size; - } - recieve_buffer = new int[send_counts[proc_rank]]; - MPI_Scatterv(matrix, send_counts, displs, MPI_INT, recieve_buffer, send_counts[proc_rank], MPI_INT, 0, MPI_COMM_WORLD); - max = MaxSearch(recieve_buffer, send_counts[proc_rank]); - int GlobMax = 0; - MPI_Reduce(&max, &GlobMax, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); - if (proc_rank == 0) + else { - end = MPI_Wtime(); - printf("max= %d\n", GlobMax); - printf("Time spent: %lf\n", end - start); - delete matrix; + // Если аргументов нет или их больше 3 + if (proc_rank == root) // для root процесса + { + printf("Enter: %s n m \n", argv[0]); + printf("n - rows\n"); + printf("m - columns\n"); + } } MPI_Finalize(); - delete[] send_counts; - delete[] displs; - delete[] recieve_buffer; return 0; }