Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. #include "pch.h"
  2. #include <mpi.h>
  3. #include <stdio.h>
  4. #include <iostream>
  5. #include <math.h>
  6.  
  7. #define MPI_ROOT_PROC (0) // id управл¤ющего узла
  8. //#define LAB_DEBUG
  9.  
  10.  
  11. const float interval_a = 0.1; // нижн¤¤ граница интервала
  12. const float interval_b = 0.5; // верхн¤¤ граница интервала
  13. const int cycle_count = 100; // количество циклов вычислени¤ дл¤ получени¤ результатов
  14.  
  15. using namespace std;
  16.  
  17. float function(float x) {
  18. return fabs(cos(x));
  19. }
  20.  
  21. int main(int argc, char *argv[]) {
  22. char host_name[MPI_MAX_PROCESSOR_NAME]; // название хоста, на котором выполн¤ет процесс
  23. int host_name_lenght = 0; // длина названи¤ хоста
  24. int group_size = 0; // размер группы (кол-во процессов в этой группе)
  25. int cur_id = MPI_PROC_NULL; // id текущего процесса
  26.  
  27. MPI_Init(&argc, &argv); // инициализируем mpi-программу
  28. MPI_Comm_size(MPI_COMM_WORLD, &group_size); // получаем количество процессов в группе
  29. MPI_Comm_rank(MPI_COMM_WORLD, &cur_id); // получаем индекс текущего процесса
  30. MPI_Get_processor_name(host_name, &host_name_lenght); // получаем им¤ текущего хоста
  31.  
  32. if (cur_id == MPI_PROC_NULL) { // если id текущего процесса неопределн выходим
  33. std::cout << host_name << " not initialized. Process id is MPI_PROC_NULL\n";
  34. MPI_Finalize();
  35. return 0;
  36. }
  37. else {
  38. std::cout << "Process id: " << cur_id << ". Host name: " << host_name << "\n";
  39. #ifdef LAB_DEBUG
  40. std::cout << "Group size: " << group_size << "\n";
  41. #endif
  42. }
  43.  
  44. int task_size = 100; // начальный размер задачи
  45. for (int i = 0; i < 5; ++i) {
  46. float global_result = 0; // глобальный результат дл¤ всех процессов (к нему обращаемс¤ только из управл¤ющего узла)
  47. MPI_Bcast(&task_size, 1, MPI_INT, MPI_ROOT_PROC, MPI_COMM_WORLD); // делаем шир. вещ. сообщение всем процессам
  48. int local_task_size = (float)task_size / group_size; // вычисл¤ем локальный размер задачи
  49. int task_start = cur_id * local_task_size;
  50. int task_end = (cur_id + 1)*local_task_size;
  51. float local_result = 0; // локальный результат дл¤ текущего процесса
  52. float step = (interval_b - interval_a) / task_size;
  53. #ifdef LAB_DEBUG
  54. std::cout << "Process id: " << cur_id << " start = " << task_start << " end = " << task_end << "\n";
  55. #endif
  56. double start_time = MPI_Wtime();
  57. for (int cycle_ind = 0; cycle_ind < cycle_count; ++cycle_ind) {
  58. for (int i = task_start; i < task_end; ++i) {
  59. local_result += function(i * step)*step;
  60. }
  61. }
  62. double end_time = MPI_Wtime();
  63. double total_time = (end_time - start_time) / cycle_count * 1000000;
  64. #ifdef LAB_DEBUG
  65. std::cout << "Reduce local result from process id: " << cur_id << "\n";
  66. #endif
  67. MPI_Reduce(&local_result, &global_result, 1, MPI_DOUBLE, MPI_SUM, MPI_ROOT_PROC, MPI_COMM_WORLD);
  68.  
  69. if (cur_id == MPI_ROOT_PROC) {
  70.  
  71. std::cout << "For task size: " << task_size << " result is " << global_result << ". Time is " << total_time;
  72.  
  73. if (total_time < 100) printf(" %3.2f\n", total_time);
  74. else printf(" %d\n", (int)total_time);
  75.  
  76. }
  77. task_size *= 10;
  78. }
  79. MPI_Finalize();
  80. std::cout << "Thank you for wating. This program finished";
  81. return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement