Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include "mpi.h"
- #include <iostream>
- #include <cstdlib>
- #include <ctime>
- #define N 64
- #define M 8
- #define CYCLE_LENGTH 10000
- using namespace std;
- int main(int argc, char **argv)
- {
- // Объявление переменных
- int rank, size;
- double time, time1, time2;
- float S1 = 1, S2 = 2;
- float **A = new float* [N], **B = new float* [N], **C = new float* [N], **Y = new float* [N];
- for (int i = 0; i < N; i++) {
- A[i] = new float [M];
- B[i] = new float [M];
- C[i] = new float [M];
- Y[i] = new float [M];
- }
- MPI_Status status; // Переменная-структура, в которую будут сохраняться параметры принимаемых сообщений с данными
- MPI_Init(&argc, &argv); // Инициализация MPI
- MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Получение номера процесса
- MPI_Comm_size(MPI_COMM_WORLD, &size); // Получения количества процессов
- cout << "Rank: " << rank << ", Size: " << size << endl;
- // Работа с нулевым процессом
- if (rank == 0)
- {
- // Инициализация массивов
- srand(1);
- for (int i = 0; i < N; i++)
- for (int j = 0; j < M; j++) {
- A[i][j] = float(1 + rand() % 10);
- B[i][j] = float(10 + rand() % 100);
- C[i][j] = float(100 + rand() % 1000);
- }
- // Фиксирование времени начала работы
- time1 = MPI_Wtime();
- // Цикл кратности
- for (int cycle = 0; cycle < CYCLE_LENGTH; cycle++)
- {
- // Рассылка значений массивов A и C другим процессам
- for (int i = 1; i < size; i++)
- for (int j = 0; j < M; j++) {
- MPI_Send(&A[(int)i*N / size][j], (int)(N * M) / size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
- }
- // Вычисление формулы
- for (int i = 0; i < N / size; i++)
- for (int j = 0; j < M; j++)
- {
- Y[i][j] = (A[i][j] + S1 * B[i][j]) * C[i][j] + S2;
- }
- // Сбор результатов вычислений в массив Y от других процеcсов
- for (int i = 1; i < size; i++)
- for (int j = 0; j < M; j++)
- MPI_Recv(&Y[(int)i*N / size][j], (int)(N * M) / size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &status);
- }
- // Фиксирование времени окончания работы и вычисление
- // общего времени вычисления нулевого процессора
- time2 = MPI_Wtime();
- time = time2 - time1;
- // Вывод результатов и времени вычисления
- cout << endl <<"Array Y[" << N << "][" << M << "]: " << endl;
- for (int i = 0; i < N / size; i++)
- for (int j = 0; j < M; j++)
- {
- cout << Y[i][j] << " ";
- }
- cout << endl << endl << "Time: " << time << endl;
- }
- else // Работа с другими процессами
- {
- srand(2);
- for (int i = 0; i < N; i++)
- for (int j = 0; j < M; j++) {
- B[i][j] = float(10 + rand() % 100);
- C[i][j] = float(100 + rand() % 1000);
- }
- // Получение значений массивов A B и C от нулевого процесса
- for (int cycle = 0; cycle < CYCLE_LENGTH; cycle++)
- {
- for (int j = 0; j < M; j++) {
- MPI_Recv(&A[(int)rank*N / size][j], (int)(N * M) / size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
- }
- // Вычисление формулы
- for (int i = rank * N / size; i < (rank + 1) * N / size; i++)
- for (int j = 0; j < M; j++)
- {
- Y[i][j] = (A[i][j] + S1 * B[i][j]) * C[i][j] + S2;
- }
- // Передача результатов нулевому процессу
- for (int j = 0; j < M; j++)
- MPI_Send(&Y[(int)rank*N / size][j], (int)(N * M) / size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
- }
- }
- for (int i = 0; i < N; i++) {
- delete []A[i];
- delete []B[i];
- delete []C[i];
- delete []Y[i];
- }
- // Завершение работы MPI
- MPI_Finalize();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement