Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include "mpi.h"
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <ctime>
  6.  
  7. #define N 64
  8. #define M 8
  9. #define CYCLE_LENGTH 10000
  10.  
  11. using namespace std;
  12.  
  13. int main(int argc, char **argv)
  14. {
  15.     // Объявление переменных
  16.     int rank, size;
  17.     double time, time1, time2;
  18.    
  19.     float S1 = 1, S2 = 2;
  20.     float **A = new float* [N], **B = new float* [N], **C = new float* [N], **Y = new float* [N];
  21.    
  22.     for (int i = 0; i < N; i++) {
  23.         A[i] = new float [M];
  24.         B[i] = new float [M];
  25.         C[i] = new float [M];
  26.         Y[i] = new float [M];
  27.     }
  28.    
  29.     MPI_Status status;                       // Переменная-структура, в которую будут сохраняться                                                                  параметры принимаемых сообщений с данными
  30.    
  31.     MPI_Init(&argc, &argv);                  // Инициализация MPI
  32.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);    // Получение номера процесса
  33.     MPI_Comm_size(MPI_COMM_WORLD, &size);    // Получения количества процессов
  34.    
  35.     cout << "Rank: " << rank << ", Size: " << size << endl;
  36.    
  37.     // Работа с нулевым процессом
  38.     if (rank == 0)
  39.     {
  40.         // Инициализация массивов
  41.         srand(1);
  42.         for (int i = 0; i < N; i++)
  43.             for (int j = 0; j < M; j++) {
  44.                 A[i][j] = float(1 + rand() % 10);
  45.                 B[i][j] = float(10 + rand() % 100);
  46.                 C[i][j] = float(100 + rand() % 1000);
  47.             }
  48.        
  49.         // Фиксирование времени начала работы
  50.         time1 = MPI_Wtime();
  51.        
  52.         // Цикл кратности
  53.         for (int cycle = 0; cycle < CYCLE_LENGTH; cycle++)
  54.         {
  55.             // Рассылка значений массивов A и C другим процессам
  56.             for (int i = 1; i < size; i++)
  57.                 for (int j = 0; j < M; j++) {
  58.                     MPI_Send(&A[(int)i*N / size][j], (int)(N * M) / size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
  59.                 }
  60.            
  61.             // Вычисление формулы
  62.             for (int i = 0; i < N / size; i++)
  63.                 for (int j = 0; j < M; j++)
  64.                 {
  65.                     Y[i][j] = (A[i][j] + S1 * B[i][j]) * C[i][j] + S2;
  66.                 }
  67.            
  68.             // Сбор результатов вычислений в массив Y от других процеcсов
  69.             for (int i = 1; i < size; i++)
  70.                 for (int j = 0; j < M; j++)
  71.                     MPI_Recv(&Y[(int)i*N / size][j], (int)(N * M)  / size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &status);
  72.         }
  73.        
  74.         // Фиксирование времени окончания работы и вычисление
  75.         // общего времени вычисления нулевого процессора
  76.         time2 = MPI_Wtime();
  77.         time = time2 - time1;
  78.        
  79.         // Вывод результатов и времени вычисления
  80.         cout << endl <<"Array Y[" << N << "][" << M << "]: " << endl;
  81.         for (int i = 0; i < N / size; i++)
  82.             for (int j = 0; j < M; j++)
  83.             {
  84.                 cout << Y[i][j] << " ";
  85.             }
  86.        
  87.         cout << endl << endl << "Time: " << time << endl;
  88.     }
  89.     else // Работа с другими процессами
  90.     {
  91.         srand(2);
  92.         for (int i = 0; i < N; i++)
  93.             for (int j = 0; j < M; j++) {
  94.                 B[i][j] = float(10 + rand() % 100);
  95.                 C[i][j] = float(100 + rand() % 1000);
  96.             }
  97.        
  98.         // Получение значений массивов A B и C от нулевого процесса
  99.         for (int cycle = 0; cycle < CYCLE_LENGTH; cycle++)
  100.         {
  101.             for (int j = 0; j < M; j++) {
  102.                 MPI_Recv(&A[(int)rank*N / size][j], (int)(N * M)  / size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
  103.             }
  104.            
  105.             // Вычисление формулы
  106.             for (int i = rank * N / size; i < (rank + 1) * N / size; i++)
  107.                 for (int j = 0; j < M; j++)
  108.                 {
  109.                     Y[i][j] = (A[i][j] + S1 * B[i][j]) * C[i][j] + S2;
  110.                 }
  111.            
  112.             // Передача результатов нулевому процессу
  113.             for (int j = 0; j < M; j++)
  114.                 MPI_Send(&Y[(int)rank*N / size][j], (int)(N * M)  / size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
  115.         }
  116.     }
  117.    
  118.    
  119.     for (int i = 0; i < N; i++) {
  120.         delete []A[i];
  121.         delete []B[i];
  122.         delete []C[i];
  123.         delete []Y[i];
  124.     }
  125.    
  126.     // Завершение работы MPI
  127.     MPI_Finalize();
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement