Advertisement
Guest User

Untitled

a guest
May 13th, 2016
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. // Подключение необходимых заголовков
  2. #include "stdafx.h"
  3. #include <stdio.h>
  4. #include <math.h>
  5. // Подключение заголовочного файла MPI
  6. #include "mpi.h"
  7.  
  8. // Функция для промежуточных вычислений
  9. double f(double a)
  10. {
  11. return (4.0 / (1.0 + a*a));
  12. }
  13.  
  14. // Главная функция программы
  15. int main(int argc, char **argv)
  16. {
  17. // Объявление переменных
  18. int done = 0, n, myid, numprocs, i;
  19. double PI25DT = 3.141592653589793238462643;
  20. double mypi, pi, h, sum, x;
  21. double startwtime = 0.0, endwtime;
  22. int namelen;
  23. char processor_name[MPI_MAX_PROCESSOR_NAME];
  24.  
  25. // Инициализация подсистемы MPI
  26. MPI_Init(&argc, &argv);
  27. // Получить размер коммуникатора MPI_COMM_WORLD
  28. // (общее число процессов в рамках задачи)
  29. MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  30. // Получить номер текущего процесса в рамках
  31. // коммуникатора MPI_COMM_WORLD
  32. MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  33. MPI_Get_processor_name(processor_name, &namelen);
  34.  
  35. // Вывод номера потока в общем пуле
  36. fprintf(stdout, "Process %d of %d is on %s\n", myid, numprocs, processor_name);
  37. fflush(stdout);
  38.  
  39. while (!done)
  40. {
  41. // количество интервалов
  42. if (myid == 0)
  43. {
  44. fprintf(stdout, "Enter the number of intervals: (0 quits) ");
  45. fflush(stdout);
  46. if (scanf_s("%d", &n) != 1)
  47. {
  48. fprintf(stdout, "No number entered; quitting\n");
  49. n = 0;
  50. }
  51. startwtime = MPI_Wtime();
  52. }
  53. // Рассылка количества интервалов всем процессам (в том числе и себе)
  54. MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  55. if (n == 0)
  56. done = 1;
  57. else
  58. {
  59. h = 1.0 / (double)n;
  60. sum = 0.0;
  61. // Обсчитывание точки, закрепленной за процессом
  62. for (i = myid + 1; (i <= n); i += numprocs)
  63. {
  64. x = h * ((double)i - 0.5);
  65. sum += f(x);
  66. }
  67. mypi = h * sum;
  68.  
  69. // Сброс результатов со всех процессов и сложение
  70. MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
  71.  
  72. // Если это главный процесс, вывод полученного результата
  73. if (myid == 0)
  74. {
  75. printf("PI is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
  76. endwtime = MPI_Wtime();
  77. printf("wall clock time = %f\n", endwtime - startwtime);
  78. fflush(stdout);
  79. }
  80. }
  81. }
  82.  
  83. // Освобождение подсистемы MPI
  84. MPI_Finalize();
  85. return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement