Guest User

Untitled

a guest
Jan 22nd, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.38 KB | None | 0 0
  1. program main
  2.  
  3. implicit none
  4.  
  5. include 'mpif.h'
  6.  
  7.  
  8.  
  9. INTEGER IERR,MYRANK,NPROCS
  10.  
  11. INTEGER LBX, LBY, ibx, iby, col, row
  12.  
  13. INTEGER, DIMENSION(2) :: ISIZE, ISUBSIZE, ISTART
  14.  
  15. INTEGER INEWTYPE, RESIZEDTYPE, REALSIZE
  16.  
  17. INTEGER(KIND=MPI_ADDRESS_KIND) :: EXTENT,BEGIN
  18.  
  19. integer :: i,ii, j,jj, k, N, NX, NY
  20.  
  21. double precision,allocatable,dimension(:,:) :: x,xx,ISEND_X
  22.  
  23. integer,allocatable,dimension(:) :: counts, displs
  24.  
  25.  
  26.  
  27. integer,parameter :: N4=4
  28.  
  29. integer :: NP
  30.  
  31. integer :: get_arg_i1
  32.  
  33.  
  34.  
  35. ! NP = 1 OK
  36.  
  37. ! NP = 2 OK
  38.  
  39. ! NP = 4 NG
  40.  
  41. ! NP = 8 NG
  42.  
  43. ! NP = 16 NG
  44.  
  45. NP = get_arg_i1()
  46.  
  47.  
  48.  
  49. N = 4
  50.  
  51. LBX = 2
  52.  
  53. LBY = 2
  54.  
  55.  
  56.  
  57. CALL MPI_INIT(IERR)
  58.  
  59. CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
  60.  
  61. CALL MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)
  62.  
  63.  
  64.  
  65. !write(*,*) "NPROCS=", NPROCS, "MYRANK=",MYRANK
  66.  
  67.  
  68.  
  69. allocate( x(N,N), xx(N,N4*N) )
  70.  
  71. allocate( ISEND_X(N/LBX, N/LBY) )
  72.  
  73. allocate( counts( LBX*LBY ), displs( LBX*LBY ) )
  74.  
  75.  
  76.  
  77. ! write(*,*) "point_01"
  78.  
  79.  
  80.  
  81. if ( MYRANK == 0 ) then
  82.  
  83. xx = 0
  84.  
  85. x = reshape([(i,i=1,N*N)],[N,N])
  86.  
  87. end if
  88.  
  89.  
  90.  
  91. CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
  92.  
  93. CALL MPI_BCAST(x,N*N,MPI_DOUBLE_PRECISION,0,&
  94. MPI_COMM_WORLD,IERR)
  95.  
  96.  
  97.  
  98. ! write(*,*) "point_02"
  99.  
  100.  
  101.  
  102. NX = N/LBX
  103.  
  104. NY = N/LBY
  105.  
  106.  
  107.  
  108. ! print x
  109.  
  110. if ( MYRANK == 0 ) then
  111.  
  112. !write(*,*) NX, NY
  113.  
  114. do j=1,N
  115.  
  116. do i=1,N
  117.  
  118. write(*, '(f5.1)', advance='no') x(i,j)
  119.  
  120. enddo
  121.  
  122. print *
  123.  
  124. enddo
  125.  
  126. write(*,*)
  127.  
  128. endif
  129.  
  130.  
  131.  
  132. if( MYRANK == 0 ) then
  133.  
  134. ibx = 0
  135.  
  136. iby = 0
  137.  
  138. else
  139.  
  140. ibx = mod(MYRANK, LBX)
  141.  
  142. iby = MYRANK / LBX
  143.  
  144. endif
  145.  
  146.  
  147.  
  148. do j=1,NY
  149.  
  150. jj = iby*NY + j
  151.  
  152. do i=1,NX
  153.  
  154. ii = ibx*NX + i
  155.  
  156. ISEND_X(i,j) = x(ii, jj)
  157.  
  158. ! write(*,*) i,j, ii,jj,ISEND_X(i,j) x(ii, jj)
  159.  
  160. enddo
  161.  
  162. enddo
  163.  
  164. ! ISEND_X = x(iby*NY+1:iby*NY+NY,ibx*NX+1:ibx*NX+NX)
  165.  
  166.  
  167.  
  168. ! write(*,*) "point_03"
  169.  
  170.  
  171.  
  172. !!! MPI grid setting !!!
  173.  
  174. ISTART = [0, 0]
  175.  
  176. ISIZE = [N, N]
  177.  
  178. ISUBSIZE = [NX, NY]
  179.  
  180.  
  181.  
  182. CALL MPI_TYPE_CREATE_SUBARRAY(2,ISIZE,ISUBSIZE,ISTART, &
  183. MPI_ORDER_FORTRAN, &
  184. MPI_DOUBLE_PRECISION, &
  185. INEWTYPE,IERR)
  186.  
  187. CALL MPI_TYPE_SIZE(MPI_DOUBLE_PRECISION,REALSIZE,IERR)
  188.  
  189. EXTENT = N*N*REALSIZE/NP
  190.  
  191. BEGIN = 0
  192.  
  193. CALL MPI_TYPE_CREATE_RESIZED(INEWTYPE,BEGIN,EXTENT, &
  194. RESIZEDTYPE,IERR)
  195.  
  196. CALL MPI_TYPE_COMMIT(RESIZEDTYPE,IERR)
  197.  
  198.  
  199.  
  200. counts = 1
  201.  
  202. displs = NP*[0,1,2,3]
  203.  
  204.  
  205.  
  206. ! print counts, displs
  207.  
  208. !if( MYRANK == 0 ) then
  209.  
  210. !write(*,*) 'counts= ', counts
  211.  
  212. !write(*,*) 'displs= ' ,displs
  213.  
  214. !endif
  215.  
  216.  
  217.  
  218.  
  219.  
  220. !!!
  221.  
  222. CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
  223.  
  224. !write(*,*) "MYRANK=",MYRANK, NX, NY, counts, displs
  225.  
  226. !do j=1,NY
  227.  
  228. !do i=1,NX
  229.  
  230. !write(*, '(f5.1)', advance='no') ISEND_X(i,j)
  231.  
  232. !enddo
  233.  
  234. !print *
  235.  
  236. !enddo
  237.  
  238. !print *
  239.  
  240. CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
  241.  
  242. CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
  243.  
  244. CALL MPI_ALLGATHERV(ISEND_X,NX*NY,MPI_DOUBLE_PRECISION, &
  245.  
  246. xx,counts,displs,RESIZEDTYPE,&
  247. MPI_COMM_WORLD,IERR)
  248.  
  249.  
  250.  
  251.  
  252.  
  253. CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
  254.  
  255. CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
  256.  
  257. CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
  258.  
  259. ! print xx
  260.  
  261. if( MYRANK == 0 ) then
  262.  
  263. ! write(*,*) "MYRANK=",MYRANK, x
  264.  
  265. do k=0,N4-1
  266.  
  267. do j=1,N
  268.  
  269. do i=1,N
  270.  
  271. write(*, '(f5.1)', advance='no') xx(i,j+k*N)
  272.  
  273. enddo
  274.  
  275. print *
  276.  
  277. enddo
  278.  
  279. print *
  280.  
  281. enddo
  282.  
  283. endif
  284.  
  285. ! enddo
  286.  
  287.  
  288.  
  289. CALL MPI_TYPE_FREE(INEWTYPE,IERR)
  290.  
  291.  
  292.  
  293. deallocate( x )
  294.  
  295. deallocate( ISEND_X )
  296.  
  297. deallocate( counts, displs )
  298.  
  299.  
  300.  
  301.  
  302.  
  303. CALL MPI_FINALIZE(IERR)
  304.  
  305.  
  306.  
  307. end program
  308.  
  309.  
  310.  
  311. integer function get_arg_i1()
  312.  
  313. character :: arg*100
  314.  
  315. get_arg_i1 = 0
  316.  
  317. if ( iargc () > 0 ) then
  318.  
  319. call getarg( 1, arg )
  320.  
  321. read(arg,*) get_arg_i1
  322.  
  323. end if
  324.  
  325. end function
Add Comment
Please, Sign In to add comment