Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #include "mpi.h"
  2. #include "stdio.h"
  3. #include <time.h>
  4.  
  5.  
  6. #define beg 2.0
  7. #define end 6.0
  8. #define h 0.00000 4//шаг интегрирования
  9.  
  10. double f(double x)
  11. {
  12. return 3 * x*x + 2*x*x*x;
  13. }
  14. int main(int argc, char* argv[])
  15. {
  16.  
  17. int myrank, ranksize, i;
  18. clock_t start, finish;
  19. MPI_Status status;
  20. MPI_Init(&argc, &argv);//Инициализация MPI
  21. //Определяем свой номер в группе:
  22. MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  23. //Определяем размер группы:
  24. MPI_Comm_size(MPI_COMM_WORLD, &ranksize);
  25. double cur_a, cur_b, d_ba, cur_h;
  26. if (!myrank)
  27. {
  28. //Это процесс-мастер
  29. //Определяем размер диапазона для каждого процесса
  30. d_ba = (end - beg) / ranksize;
  31. //Оставляем первый диапазон для мастера:
  32. cur_a = beg + d_ba;
  33. cur_h = h;
  34. start = clock();
  35. //Рассылаем исходные данные подчиненным процессам:
  36. for (i = 1; i < ranksize; i++)
  37. {
  38. cur_b = cur_a + d_ba - h;
  39. MPI_Send(&cur_a, 1, MPI_DOUBLE, i, 98, MPI_COMM_WORLD);
  40. MPI_Send(&cur_b, 1, MPI_DOUBLE, i, 99, MPI_COMM_WORLD);
  41. MPI_Send(&cur_h, 1, MPI_DOUBLE, i, 100, MPI_COMM_WORLD);
  42. cur_a += d_ba;
  43. }
  44. cur_a = beg; cur_b = beg + d_ba - h;
  45. }
  46. else
  47. {
  48. //Это один из подчиненных процессов
  49. //Получаем исходные данные
  50. MPI_Recv(&cur_a, 1, MPI_DOUBLE, 0, 98, MPI_COMM_WORLD, &status);
  51. MPI_Recv(&cur_b, 1, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, &status);
  52. MPI_Recv(&cur_h, 1, MPI_DOUBLE, 0, 100, MPI_COMM_WORLD, &status);
  53. }
  54. //Расчет интеграла в своем диапазоне выполняют все процессы:
  55. double s = 0, s1;
  56. printf("Process %d. A=%.4f B=%.4f h=%.10f\n", myrank, cur_a, cur_b+cur_h, cur_h);
  57. for (cur_a += cur_h; cur_a <= cur_b; cur_a += cur_h)
  58. s += cur_h*f(cur_a);
  59. if (!myrank)
  60. {
  61. //Это процесс-мастер
  62. //Собираем результаты расчетов:
  63. for (i = 1; i < ranksize; i++)
  64. {
  65. MPI_Recv(&s1, 1, MPI_DOUBLE, i, 101, MPI_COMM_WORLD, &status);
  66. s += s1;
  67. }
  68. finish = clock();
  69. //печать результата:
  70. printf("Integral value: %.4f\n", s);
  71. printf("Time: %.4f\n", (double)(finish - start) / CLOCKS_PER_SEC);
  72. }
  73. else
  74. //Это подчиненный процесс, отправляем результаты мастеру:
  75. MPI_Send(&s, 1, MPI_DOUBLE, 0, 101, MPI_COMM_WORLD);
  76. MPI_Finalize();//Завершение работы с MPI
  77. return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement