Skip to content

Commit 1754063

Browse files
committed
refactor(omp): move omp sendrecv to its own file
1 parent b464e88 commit 1754063

File tree

3 files changed

+43
-22
lines changed

3 files changed

+43
-22
lines changed

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ set(SRC
88
omp/backend.f90
99
omp/common.f90
1010
omp/kernels_dist.f90
11+
omp/sendrecv.f90
1112
)
1213
set(CUDASRC
1314
cuda/backend.f90

src/omp/sendrecv.f90

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
module m_omp_sendrecv
2+
use mpi
3+
4+
use m_common, only: dp
5+
6+
implicit none
7+
8+
contains
9+
10+
subroutine sendrecv_fields(f_recv_s, f_recv_e, f_send_s, f_send_e, &
11+
n_data, nproc, prev, next)
12+
implicit none
13+
14+
real(dp), dimension(:, :, :), intent(out) :: f_recv_s, f_recv_e
15+
real(dp), dimension(:, :, :), intent(in) :: f_send_s, f_send_e
16+
integer, intent(in) :: n_data, nproc, prev, next
17+
18+
integer :: req(4), err(4), ierr, tag = 1234
19+
20+
if (nproc == 1) then
21+
f_recv_s = f_send_e
22+
f_recv_e = f_send_s
23+
else
24+
call MPI_Isend(f_send_s, n_data, MPI_DOUBLE_PRECISION, &
25+
prev, tag, MPI_COMM_WORLD, req(1), err(1))
26+
call MPI_Irecv(f_recv_e, n_data, MPI_DOUBLE_PRECISION, &
27+
next, tag, MPI_COMM_WORLD, req(2), err(2))
28+
call MPI_Isend(f_send_e, n_data, MPI_DOUBLE_PRECISION, &
29+
next, tag, MPI_COMM_WORLD, req(3), err(3))
30+
call MPI_Irecv(f_recv_s, n_data, MPI_DOUBLE_PRECISION, &
31+
prev, tag, MPI_COMM_WORLD, req(4), err(4))
32+
33+
call MPI_Waitall(4, req, MPI_STATUSES_IGNORE, ierr)
34+
end if
35+
36+
end subroutine sendrecv_fields
37+
38+
end module m_omp_sendrecv

tests/omp/test_omp_tridiag.f90

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ program test_omp_tridiag
66
use m_common, only: dp, pi
77
use m_omp_common, only: SZ
88
use m_omp_kernels_dist, only: der_univ_dist_omp, der_univ_subs_omp
9+
use m_omp_sendrecv, only: sendrecv_fields
910

1011
use m_tdsops, only: tdsops_t, tdsops_init
1112

@@ -297,28 +298,9 @@ subroutine run_kernel(n_iters, n_block, u, du, tdsops, n, &
297298
!$omp end parallel do
298299

299300
! halo exchange
300-
if (nproc == 1) then
301-
u_recv_s = u_send_e
302-
u_recv_e = u_send_s
303-
else
304-
! MPI send/recv for multi-rank simulations
305-
call MPI_Isend(u_send_s, SZ*n_halo*n_block, &
306-
MPI_DOUBLE_PRECISION, pprev, tag1, MPI_COMM_WORLD, &
307-
mpireq(1), srerr(1))
308-
call MPI_Irecv(u_recv_e, SZ*n_halo*n_block, &
309-
MPI_DOUBLE_PRECISION, pnext, tag1, MPI_COMM_WORLD, &
310-
mpireq(2), srerr(2))
311-
call MPI_Isend(u_send_e, SZ*n_halo*n_block, &
312-
MPI_DOUBLE_PRECISION, pnext, tag2, MPI_COMM_WORLD, &
313-
mpireq(3), srerr(3))
314-
call MPI_Irecv(u_recv_s, SZ*n_halo*n_block, &
315-
MPI_DOUBLE_PRECISION, pprev, tag2, MPI_COMM_WORLD, &
316-
mpireq(4), srerr(4))
317-
318-
call MPI_Waitall(4, mpireq, MPI_STATUSES_IGNORE, ierr)
319-
end if
320-
321-
301+
call sendrecv_fields(u_recv_s, u_recv_e, u_send_s, u_send_e, &
302+
SZ*n_halo*n_block, nproc, pprev, pnext)
303+
322304
!$omp parallel do
323305
do k = 1, n_block
324306
call der_univ_dist_omp( &

0 commit comments

Comments
 (0)