16 integer(kind=kint ) :: neibpetot = 0
17 integer(kind=kint ),
pointer :: stack_import(:)
18 integer(kind=kint ),
pointer :: nod_import (:)
19 real (kind=
kreal),
pointer :: ws(:)
20 real (kind=
kreal),
pointer :: wr(:)
21 real (kind=
kreal),
pointer :: x(:)
22 integer(kind=kint ),
pointer :: req1(:)
23 integer(kind=kint ),
pointer :: req2(:)
24 integer(kind=kint ) :: nreq1
25 integer(kind=kint ) :: nreq2
37 & ( n, m, neibpetot, neibpe, &
38 & stack_import, nod_import, &
39 & stack_export, nod_export, ws, wr, x, &
40 & solver_comm,my_rank)
50 integer(kind=kint ) ,
intent(in) :: N, m
51 integer(kind=kint ) ,
intent(in) :: NEIBPETOT
52 integer(kind=kint ),
pointer :: NEIBPE (:)
53 integer(kind=kint ),
pointer :: STACK_IMPORT(:)
54 integer(kind=kint ),
pointer :: NOD_IMPORT (:)
55 integer(kind=kint ),
pointer :: STACK_EXPORT(:)
56 integer(kind=kint ),
pointer :: NOD_EXPORT (:)
57 real (kind=
kreal),
dimension(: ),
intent(inout):: ws
58 real (kind=
kreal),
dimension(: ),
intent(inout):: wr
59 real (kind=
kreal),
dimension(: ),
intent(inout):: x
60 integer(kind=kint ) ,
intent(in) ::SOLVER_COMM
61 integer(kind=kint ) ,
intent(in) :: my_rank
64 integer(kind=kint ),
dimension(:,:),
allocatable :: sta1
65 integer(kind=kint ),
dimension(:,:),
allocatable :: sta2
66 integer(kind=kint ),
dimension(: ),
allocatable :: req1
67 integer(kind=kint ),
dimension(: ),
allocatable :: req2
69 integer(kind=kint ),
save :: NFLAG
72 integer(kind=kint ) :: neib,istart,inum,k,kk,ii,ierr,nreq1,nreq2
74 integer(kind=kint):: ns, nr
75 type(c_devptr) :: WS_dev, WR_dev
79 allocate (sta1(mpi_status_size,neibpetot))
80 allocate (sta2(mpi_status_size,neibpetot))
81 allocate (req1(neibpetot))
82 allocate (req2(neibpetot))
85 ns = stack_export(neibpetot)
86 nr = stack_import(neibpetot)
88 ws_dev = acc_malloc(
kreal * m * ns)
89 wr_dev = acc_malloc(
kreal * m * nr)
91 call acc_map_data(ws, ws_dev,
kreal * m * ns)
92 call acc_map_data(wr, wr_dev,
kreal * m * nr)
99 istart= stack_export(neib-1)
100 inum = stack_export(neib ) - istart
106 do k= istart+1, istart+inum
109 ws(m*(k-1)+kk)= x(m*(ii-1)+kk)
114 do k= istart+1, istart+inum
117 ws(m*(k-1)+kk)= x(m*(ii-1)+kk)
123 call mpi_isend (ws(m*istart+1), m*inum,mpi_double_precision, &
124 & neibpe(neib), 0, solver_comm, req1(nreq1), ierr)
131 do neib= 1, neibpetot
132 istart= stack_import(neib-1)
133 inum = stack_import(neib ) - istart
137 call mpi_irecv (wr(m*istart+1), m*inum, mpi_double_precision, &
138 & neibpe(neib), 0, solver_comm, req2(nreq2), ierr)
142 call mpi_waitall (nreq2, req2, sta2, ierr)
144 do neib= 1, neibpetot
145 istart= stack_import(neib-1)
146 inum = stack_import(neib ) - istart
150 do k= istart+1, istart+inum
153 x(m*(ii-1)+kk)= wr(m*(k-1)+kk)
158 do k= istart+1, istart+inum
161 x(m*(ii-1)+kk)= wr(m*(k-1)+kk)
167 call mpi_waitall (nreq1, req1, sta1, ierr)
169 deallocate (sta1, sta2, req1, req2)
172 call acc_unmap_data(ws)
173 call acc_unmap_data(wr)
175 call acc_free(ws_dev)
176 call acc_free(wr_dev)
185 & ( n, m, neibpetot, neibpe, stack_import, nod_import, &
186 & stack_export, nod_export, &
187 & x, solver_comm,my_rank,ireq)
189 integer(kind=kint ) ,
intent(in) :: N, M
190 integer(kind=kint ) ,
intent(in) :: NEIBPETOT
191 integer(kind=kint ),
pointer :: NEIBPE (:)
192 integer(kind=kint ),
pointer :: STACK_IMPORT(:)
193 integer(kind=kint ),
pointer :: NOD_IMPORT (:)
194 integer(kind=kint ),
pointer :: STACK_EXPORT(:)
195 integer(kind=kint ),
pointer :: NOD_EXPORT (:)
196 real (kind=
kreal),
target,
intent(inout):: x(:)
197 integer(kind=kint ) ,
intent(in) ::SOLVER_COMM
198 integer(kind=kint ) ,
intent(in) :: my_rank
199 integer(kind=kint ) ,
intent(out) :: ireq
203 real (kind=
kreal),
pointer :: ws(:)
204 real (kind=
kreal),
pointer :: wr(:)
205 integer(kind=kint ),
pointer :: req1(:)
206 integer(kind=kint ),
pointer :: req2(:)
207 integer(kind=kint ) :: neib,istart,inum,k,kk,ii,ierr,i,nreq1,nreq2
210 allocate (ws(m*stack_export(neibpetot)), stat=ierr)
211 if( ierr /= 0 ) stop
"Allocation error: WS in hecmw_solver_SR"
212 allocate (wr(m*stack_import(neibpetot)), stat=ierr)
213 if( ierr /= 0 ) stop
"Allocation error: WR in hecmw_solver_SR"
214 allocate (req1(neibpetot))
215 allocate (req2(neibpetot))
219 do neib= 1, neibpetot
220 istart= stack_export(neib-1)
221 inum = stack_export(neib ) - istart
224 do k= istart+1, istart+inum
227 ws(m*(k-1)+kk)= x(m*(ii-1)+kk)
230 call mpi_isend (ws(m*istart+1), m*inum,mpi_double_precision, &
231 & neibpe(neib), 0, solver_comm, req1(nreq1), ierr)
236 do neib= 1, neibpetot
237 istart= stack_import(neib-1)
238 inum = stack_import(neib ) - istart
241 call mpi_irecv (wr(m*istart+1), m*inum, mpi_double_precision, &
242 & neibpe(neib), 0, solver_comm, req2(nreq2), ierr)
248 if (
abuf(i)%NEIBPETOT == 0)
then
254 stop
'Error: HECMW_SOLVE_ISEND_IRECV: exceeded maximum num of requests'
258 abuf(ireq)%NEIBPETOT = neibpetot
259 abuf(ireq)%STACK_IMPORT=> stack_import
260 abuf(ireq)%NOD_IMPORT => nod_import
264 abuf(ireq)%req1 => req1
265 abuf(ireq)%req2 => req2
266 abuf(ireq)%nreq1 = nreq1
267 abuf(ireq)%nreq2 = nreq2
277 integer(kind=kint ),
intent(in) :: m, ireq
281 integer(kind=kint ) :: NEIBPETOT
282 integer(kind=kint ),
pointer :: STACK_IMPORT(:)
283 integer(kind=kint ),
pointer :: NOD_IMPORT (:)
284 real (kind=
kreal),
pointer :: ws(:)
285 real (kind=
kreal),
pointer :: wr(:)
286 real (kind=
kreal),
pointer :: x(:)
287 integer(kind=kint ),
pointer :: req1(:)
288 integer(kind=kint ),
pointer :: req2(:)
289 integer(kind=kint ),
dimension(:,:),
allocatable :: sta1
290 integer(kind=kint ),
dimension(:,:),
allocatable :: sta2
291 integer(kind=kint ) :: neib,istart,inum,k,j,ii,ierr,nreq1,nreq2
293 if (ireq < 0 .or. ireq >
max_nreq)
then
294 stop
'ERROR: HECMW_SOLVE_ISEND_IRECV_WAIT: invalid ireq'
297 neibpetot =
abuf(ireq)%NEIBPETOT
298 stack_import=>
abuf(ireq)%STACK_IMPORT
299 nod_import =>
abuf(ireq)%NOD_IMPORT
303 req1 =>
abuf(ireq)%req1
304 req2 =>
abuf(ireq)%req2
305 nreq1 =
abuf(ireq)%nreq1
306 nreq2 =
abuf(ireq)%nreq2
308 abuf(ireq)%NEIBPETOT = 0
310 allocate (sta1(mpi_status_size,neibpetot))
311 allocate (sta2(mpi_status_size,neibpetot))
313 call mpi_waitall (nreq2, req2, sta2, ierr)
314 do neib= 1, neibpetot
315 istart= stack_import(neib-1)
316 inum = stack_import(neib ) - istart
317 do k= istart+1, istart+inum
320 x(m*(ii-1)+j)= wr(m*(k-1)+j)
325 call mpi_waitall (nreq1, req1, sta1, ierr)
327 deallocate (sta1, sta2)
328 deallocate (req1, req2)
337 & ( n, m, neibpetot, neibpe, stack_import, nod_import, &
338 & stack_export, nod_export, &
339 & ws, wr, x, solver_comm,my_rank)
343 integer(kind=kint ) ,
intent(in) :: N, M
344 integer(kind=kint ) ,
intent(in) :: NEIBPETOT
345 integer(kind=kint ),
pointer :: NEIBPE (:)
346 integer(kind=kint ),
pointer :: STACK_IMPORT(:)
347 integer(kind=kint ),
pointer :: NOD_IMPORT (:)
348 integer(kind=kint ),
pointer :: STACK_EXPORT(:)
349 integer(kind=kint ),
pointer :: NOD_EXPORT (:)
350 real (kind=
kreal),
dimension(: ),
intent(inout):: ws
351 real (kind=
kreal),
dimension(: ),
intent(inout):: wr
352 real (kind=
kreal),
dimension(: ),
intent(inout):: x
353 integer(kind=kint ) ,
intent(in) ::SOLVER_COMM
354 integer(kind=kint ) ,
intent(in) :: my_rank
357 integer(kind=kint ),
dimension(:,:),
allocatable :: sta1
358 integer(kind=kint ),
dimension(:,:),
allocatable :: sta2
359 integer(kind=kint ),
dimension(: ),
allocatable :: req1
360 integer(kind=kint ),
dimension(: ),
allocatable :: req2
363 integer(kind=kint ) :: neib,istart,inum,k,kk,ii,ierr,nreq1,nreq2
366 allocate (sta1(mpi_status_size,neibpetot))
367 allocate (sta2(mpi_status_size,neibpetot))
368 allocate (req1(neibpetot))
369 allocate (req2(neibpetot))
374 do neib= 1, neibpetot
375 istart= stack_import(neib-1)
376 inum = stack_import(neib ) - istart
379 do k= istart+1, istart+inum
382 ws(m*(k-1)+kk)= x(m*(ii-1)+kk)
386 call mpi_isend (ws(m*istart+1), m*inum,mpi_double_precision, &
387 & neibpe(neib), 0, solver_comm, req1(nreq1), ierr)
393 do neib= 1, neibpetot
394 istart= stack_export(neib-1)
395 inum = stack_export(neib ) - istart
398 call mpi_irecv (wr(m*istart+1), m*inum, mpi_double_precision, &
399 & neibpe(neib), 0, solver_comm, req2(nreq2), ierr)
402 call mpi_waitall (nreq2, req2, sta2, ierr)
404 do neib= 1, neibpetot
405 istart= stack_export(neib-1)
406 inum = stack_export(neib ) - istart
407 do k= istart+1, istart+inum
410 x(m*(ii-1)+kk)= x(m*(ii-1)+kk)+wr(m*(k-1)+kk)
415 call mpi_waitall (nreq1, req1, sta1, ierr)
416 deallocate (sta1, sta2, req1, req2)
subroutine hecmw_solve_isend_irecv_wait(m, ireq)
type(async_buf), dimension(max_nreq), save abuf
integer(kind=kint), parameter max_nreq
subroutine hecmw_solve_isend_irecv(N, M, NEIBPETOT, NEIBPE, STACK_IMPORT, NOD_IMPORT, STACK_EXPORT, NOD_EXPORT, X, SOLVER_COMM, my_rank, ireq)
subroutine hecmw_solve_send_recv(N, m, NEIBPETOT, NEIBPE, STACK_IMPORT, NOD_IMPORT, STACK_EXPORT, NOD_EXPORT, WS, WR, X, SOLVER_COMM, my_rank)
subroutine hecmw_solve_rev_send_recv(N, M, NEIBPETOT, NEIBPE, STACK_IMPORT, NOD_IMPORT, STACK_EXPORT, NOD_EXPORT, WS, WR, X, SOLVER_COMM, my_rank)
integer(kind=4), parameter kreal