Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include "mpi.h"
  6.  
  7. #define N 10000 //Длина стороны сетки
  8. #define NUM_EPOCHS 300 //Количество шагов
  9. #define SIGMA 0.36
  10. #define K_X 1.228
  11. #define K_Y 1.1488
  12.  
  13. int main(int argc, char **argv)
  14. {
  15. int myid, numprocs;
  16. double startwtime = 0.0, endwtime;
  17.  
  18. MPI_Init(&argc, &argv);
  19. MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
  20. MPI_Comm_rank(MPI_COMM_WORLD,&myid);
  21. MPI_Status status;
  22. MPI_Request request;
  23.  
  24. //Каждому потоку по куску сетки
  25. int myWidth = myid <= N % numprocs ? N / numprocs + 1 : N / numprocs;//ширина куска сетки
  26. double **myField = (double **) malloc(myWidth * sizeof(double*));
  27. double **myOldField = (double **) malloc(myWidth * sizeof(double*));
  28. int i, j;
  29. for(i = 0; i < myWidth; ++i) {
  30. myField[i] = (double *) malloc(N * sizeof(double));
  31. myOldField[i] = (double *) malloc(N * sizeof(double));
  32. for(j = 0; j < N; ++j) {
  33. myField[i][j] = 0;
  34. myOldField[i][j] = sin(2 * M_PI * (K_X * j + K_Y * i));
  35. }
  36. }
  37. double highLine[N], lowLine[N];
  38. int curEpoch;
  39.  
  40. startwtime = MPI_Wtime();
  41.  
  42. for(curEpoch = 0; curEpoch < NUM_EPOCHS; ++curEpoch) {
  43. if(myid < numprocs-1) {
  44. MPI_Isend(myOldField[myWidth-1], N, MPI_DOUBLE, myid+1, 0, MPI_COMM_WORLD, &request);
  45. MPI_Barrier(MPI_COMM_WORLD);
  46. MPI_Recv(lowLine, N, MPI_DOUBLE, myid+1, 0, MPI_COMM_WORLD, &status);
  47. }
  48. if(myid > 0) {
  49. MPI_Isend(myOldField[0], N, MPI_DOUBLE, myid-1, 0, MPI_COMM_WORLD, &request);
  50. MPI_Barrier(MPI_COMM_WORLD);
  51. MPI_Recv(highLine, N, MPI_DOUBLE, myid-1, 0, MPI_COMM_WORLD, &status);
  52. //printf("%f\n", highLine[0]);
  53. }
  54.  
  55. for(i = 0; i < myWidth; ++i) {
  56. for(j = 0; j < N; ++j) {
  57. myField[i][j] = SIGMA * (
  58. (i < myWidth - 1) ? myOldField[i+1][j] : lowLine[j] +
  59. (i > 0) ? myOldField[i-1][j] : highLine[j] +
  60. (j > 0) ? myOldField[i][j-1] : 0 +
  61. (j < N - 1) ? myOldField[i][j+1] : 0
  62. ) + myOldField[i][j];
  63.  
  64. }
  65. }
  66.  
  67. for(i = 0; i < myWidth; ++i)
  68. for(j = 0; j < N; ++j)
  69. myOldField[i][j] = myField[i][j];
  70.  
  71. //MPI_Barrier(MPI_COMM_WORLD);
  72. }
  73. if(myid==0)
  74. {
  75. endwtime = MPI_Wtime();
  76. printf("wall clock time =%f\n", endwtime-startwtime);
  77. fflush(stdout);
  78. }
  79. int k;
  80. FILE* res = fopen("res.txt", "w");
  81. if (res == NULL){
  82. perror("File res is not open");
  83. return 1;
  84. }
  85. for(k = 0; k < numprocs; ++k) {
  86. if(myid == k) {
  87. fprintf(res, "I am number %d, my chunk:\n", myid);
  88. for(i = 0; i < myWidth; ++i){
  89. for(j = 0; j < N; ++j)
  90. fprintf(res,"%0.4f ", myOldField[i][j]);
  91. fprintf(res,"\n");
  92. }
  93.  
  94. }
  95. MPI_Barrier(MPI_COMM_WORLD);
  96. }
  97. fclose(res);
  98. MPI_Finalize();
  99. return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement