Skip to content

Commit 27b24a5

Browse files
committed
added missing blk_bounds to gang methods and updated test
1 parent 12d9d54 commit 27b24a5

File tree

3 files changed

+115
-32
lines changed

3 files changed

+115
-32
lines changed

src/buffer/field_RANKSUFF_gang_module.fypp

+5-5
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ CONTAINS
6969
INTEGER(KIND=JPIM), OPTIONAL, INTENT(IN) :: BLK_BOUNDS(2)
7070

7171
IF (ASSOCIATED (SELF%PARENT)) THEN
72-
CALL SELF%PARENT%CREATE_DEVICE_DATA ()
72+
CALL SELF%PARENT%CREATE_DEVICE_DATA (BLK_BOUNDS=BLK_BOUNDS)
7373
ENDIF
7474

7575
END SUBROUTINE
@@ -104,13 +104,13 @@ CONTAINS
104104

105105
IF (ASSOCIATED (SELF%PARENT)) THEN
106106
IF (IAND (MODE, NWR) /= 0) THEN
107-
CALL SELF%PARENT%SYNC_${what}$_RDWR (QUEUE)
107+
CALL SELF%PARENT%SYNC_${what}$_RDWR (QUEUE, BLK_BOUNDS)
108108
ELSEIF (IAND (MODE, NRD) /= 0) THEN
109-
CALL SELF%PARENT%SYNC_${what}$_RDONLY (QUEUE)
109+
CALL SELF%PARENT%SYNC_${what}$_RDONLY (QUEUE, BLK_BOUNDS)
110110
ENDIF
111111
ENDIF
112112

113-
CALL SELF%${ftn1}$_WRAPPER%GET_${what}$_DATA (MODE, PTR, QUEUE)
113+
CALL SELF%${ftn1}$_WRAPPER%GET_${what}$_DATA (MODE, PTR, QUEUE, BLK_BOUNDS=BLK_BOUNDS)
114114

115115
END SUBROUTINE
116116

@@ -257,7 +257,7 @@ CONTAINS
257257
INTEGER(KIND=JPIM), OPTIONAL, INTENT(IN) :: BLK_BOUNDS(2)
258258
INTEGER (KIND=JPIM) :: JFLD
259259

260-
CALL SELF%${ftn}$_${type}$%CREATE_DEVICE_DATA ()
260+
CALL SELF%${ftn}$_${type}$%CREATE_DEVICE_DATA (BLK_BOUNDS=BLK_BOUNDS)
261261

262262
#:set ar = ', '.join ([':'] * (ft.rank-2))
263263
DO JFLD = 1, SIZE (SELF%CHILDREN)

src/core/field_RANKSUFF_module.fypp

+25-13
Original file line numberDiff line numberDiff line change
@@ -434,15 +434,14 @@ CONTAINS
434434
INTEGER (KIND=JPIM), INTENT(IN) :: KDIR
435435
INTEGER (KIND=JPIM), OPTIONAL, INTENT(IN) :: QUEUE
436436
INTEGER(KIND=JPIM), OPTIONAL, INTENT(IN) :: BLK_BOUNDS(2)
437-
437+
438438
INTEGER(KIND=JPIM) :: LB, UB
439439
${ft.type}$, POINTER :: HST_BLK(${ft.shape}$) => NULL()
440440
REAL :: START, FINISH
441-
441+
442+
CALL CPU_TIME(START)
442443
IF ( .NOT. PRESENT(BLK_BOUNDS) ) THEN
443-
CALL CPU_TIME(START)
444444
CALL SELF%COPY_FUNC (SELF%PTR, SELF%DEVPTR, SELF%MAP_DEVPTR, KDIR, QUEUE)
445-
CALL CPU_TIME(FINISH)
446445
ELSE
447446
LB = LBOUND(SELF%PTR, ${ft.rank}$)
448447
UB = UBOUND(SELF%PTR, ${ft.rank}$)
@@ -452,6 +451,8 @@ CONTAINS
452451
HST_BLK => SELF%PTR(${ft.hst_blk}$)
453452
CALL SELF%COPY_FUNC(HST_BLK, SELF%DEVPTR, SELF%MAP_DEVPTR, KDIR, QUEUE)
454453
END IF
454+
CALL CPU_TIME(FINISH)
455+
455456
IF (KDIR == NH2D) THEN
456457
CALL SELF%STATS%INC_CPU_TO_GPU_TRANSFER(START, FINISH)
457458
ELSE IF (KDIR == ND2H) THEN
@@ -546,8 +547,20 @@ CONTAINS
546547
SUBROUTINE ${ftn}$_CREATE_DEVICE_DATA (SELF, BLK_BOUNDS)
547548
CLASS(${ftn}$) :: SELF
548549
INTEGER(KIND=JPIM), OPTIONAL, INTENT(IN) :: BLK_BOUNDS(2)
550+
INTEGER(KIND=JPIM) :: DEVPTR_SIZE
551+
552+
IF ( PRESENT(BLK_BOUNDS) ) THEN
553+
DEVPTR_SIZE = SIZE(SELF%PTR(${':,'*(ft.rank-1)}$ BLK_BOUNDS(1):BLK_BOUNDS(2)))
554+
ELSE
555+
DEVPTR_SIZE = SIZE(SELF%PTR)
556+
ENDIF
557+
558+
IF (.NOT. ASSOCIATED (SELF%DEVPTR) ) THEN
559+
CALL DEV_ALLOCATE_HST (DEV=SELF%DEVPTR, HST=SELF%PTR, MAP_DEVPTR=SELF%MAP_DEVPTR, BLK_BOUNDS=BLK_BOUNDS)
560+
ELSE IF ( SIZE(SELF%DEVPTR) < DEVPTR_SIZE ) THEN
561+
CALL DEV_ALLOCATE_HST (DEV=SELF%DEVPTR, HST=SELF%PTR, MAP_DEVPTR=SELF%MAP_DEVPTR, BLK_BOUNDS=BLK_BOUNDS)
562+
ENDIF
549563

550-
CALL DEV_ALLOCATE_HST (DEV=SELF%DEVPTR, HST=SELF%PTR, MAP_DEVPTR=SELF%MAP_DEVPTR, BLK_BOUNDS=BLK_BOUNDS)
551564
END SUBROUTINE
552565

553566
SUBROUTINE ${ftn}$_GET_DEVICE_DATA (SELF, MODE, PTR, QUEUE, BLK_BOUNDS)
@@ -556,19 +569,19 @@ CONTAINS
556569
${ft.type}$, POINTER, INTENT(INOUT) :: PTR(${ft.shape}$)
557570
INTEGER (KIND=JPIM), OPTIONAL, INTENT(IN) :: QUEUE
558571
INTEGER(KIND=JPIM), OPTIONAL, INTENT(IN) :: BLK_BOUNDS(2)
559-
572+
560573
INTEGER(KIND=JPIM) :: LBOUNDS(${ft.rank}$)
561-
574+
562575
LBOUNDS=LBOUND(SELF%PTR)
563-
IF (.NOT. ASSOCIATED (SELF%DEVPTR)) THEN
564-
CALL SELF%CREATE_DEVICE_DATA(BLK_BOUNDS=BLK_BOUNDS)
565-
ENDIF
576+
577+
CALL SELF%CREATE_DEVICE_DATA(BLK_BOUNDS=BLK_BOUNDS)
578+
566579
IF (IAND (SELF%GET_STATUS (), NDEVFRESH) == 0) THEN
567580
CALL SELF%COPY_DATA (NH2D, QUEUE, BLK_BOUNDS=BLK_BOUNDS)
568581
CALL SELF%SET_STATUS (IOR (SELF%GET_STATUS (), NDEVFRESH))
569582
ENDIF
570583
IF ( PRESENT(BLK_BOUNDS) ) THEN
571-
PTR ( ${ft.lbptr_blk}$) => SELF%DEVPTR (${ft.devptr_blk}$)
584+
PTR (${ft.lbptr_blk}$) => SELF%DEVPTR (${ft.devptr_blk}$)
572585
ELSE
573586
PTR (${ft.lbptr}$) => SELF%DEVPTR (${','.join(':' for _ in range(ft.rank))}$)
574587
END IF
@@ -614,7 +627,6 @@ CONTAINS
614627
IF(SELF%GET_STATUS ()==UNALLOCATED)THEN
615628
CALL SELF%CREATE_HOST_DATA ()
616629
IF (SELF%HAS_INIT_VALUE) THEN
617-
CALL SELF%CREATE_DEVICE_DATA(BLK_BOUNDS=BLK_BOUNDS)
618630
SELF%PTR=SELF%INIT_VALUE
619631
CALL SELF%SET_STATUS (NHSTFRESH)
620632
ENDIF
@@ -670,7 +682,7 @@ CONTAINS
670682
INTEGER(KIND=JPIM), OPTIONAL, INTENT(IN) :: BLK_BOUNDS(2)
671683
${ft.type}$, POINTER :: ZPTR(${ft.shape}$)
672684

673-
CALL SELF%GET_DEVICE_DATA_RDWR (ZPTR, QUEUE)
685+
CALL SELF%GET_DEVICE_DATA_RDWR (ZPTR, QUEUE, BLK_BOUNDS=BLK_BOUNDS)
674686

675687
END SUBROUTINE ${ftn}$_SYNC_DEVICE_RDWR
676688

tests/test_get_device_data_bounds.F90

+85-14
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ PROGRAM TEST_GET_DEVICE_DATA_BOUNDS
1616
IMPLICIT NONE
1717

1818
CLASS(FIELD_2RB), POINTER :: F_PTR => NULL()
19-
REAL(KIND=JPRB), POINTER :: PTR_CPU(:,:)
20-
REAL(KIND=JPRB), POINTER :: PTR_GPU(:,:)
19+
REAL(KIND=JPRB), POINTER :: PTR_CPU(:,:) => NULL()
20+
REAL(KIND=JPRB), POINTER :: PTR_GPU(:,:) => NULL()
21+
REAL(KIND=JPRB), POINTER :: PTR_GPU2(:,:) => NULL()
2122
LOGICAL :: OKAY
2223
INTEGER :: I,J
2324

@@ -36,19 +37,12 @@ PROGRAM TEST_GET_DEVICE_DATA_BOUNDS
3637
IF ( PTR_GPU(I,J) /= 42 ) THEN
3738
OKAY = .FALSE.
3839
END IF
40+
PTR_GPU(I,J) = 32
3941
END DO
4042
END DO
43+
!$acc end serial
4144

42-
IF ( OKAY ) THEN
43-
DO I=1,128
44-
DO J = 1,2
45-
PTR_GPU(I,J) = 32
46-
END DO
47-
END DO
48-
END IF
49-
!$acc end serial
50-
51-
IF (.NOT. OKAY) THEN
45+
IF (.NOT. OKAY) THEN
5246
CALL FIELD_ABORT("ERROR DATA NOT UPDATED ON DEVICE")
5347
END IF
5448

@@ -61,7 +55,7 @@ PROGRAM TEST_GET_DEVICE_DATA_BOUNDS
6155
END DO
6256
END DO
6357

64-
IF (.NOT. OKAY) THEN
58+
IF (.NOT. OKAY) THEN
6559
CALL FIELD_ABORT("ERROR HOST DATA NOT UPDATED BY SYNC_HOST_RDWR")
6660
END IF
6761

@@ -71,9 +65,86 @@ PROGRAM TEST_GET_DEVICE_DATA_BOUNDS
7165
END IF
7266
END DO
7367

74-
IF (.NOT. OKAY) THEN
68+
IF (.NOT. OKAY) THEN
7569
CALL FIELD_ABORT("ERROR HOST 3RD COLUMN OF PTR_CPU SHOULD NOT HAVE BEEN MODIFIED")
7670
END IF
7771

72+
PTR_CPU(:,1) = 38
73+
PTR_CPU(:,2) = 38
74+
PTR_CPU(:,3) = 39
75+
CALL F_PTR%GET_DEVICE_DATA_RDWR(PTR_GPU, BLK_BOUNDS=[3,3])
76+
!$acc serial, present(PTR_GPU), copy(OKAY)
77+
DO I=1,128
78+
IF ( PTR_GPU(I,J) /= 39 ) THEN
79+
OKAY = .FALSE.
80+
END IF
81+
PTR_GPU(I,J) = 40
82+
END DO
83+
!$acc end serial
84+
85+
IF (.NOT. OKAY) THEN
86+
CALL FIELD_ABORT("ERROR DEVICE DATA NOT UPDATED BY GET_DEVICE_DATA_RDWR")
87+
END IF
88+
89+
CALL F_PTR%SYNC_HOST_RDWR(BLK_BOUNDS=[3,3])
90+
91+
DO I=1,128
92+
IF ( PTR_CPU(I,J) /= 40 ) THEN
93+
OKAY =.FALSE.
94+
END IF
95+
END DO
96+
97+
IF (.NOT. OKAY) THEN
98+
CALL FIELD_ABORT("ERROR HOST DATA NOT UPDATED BY SYNC_HOST_RDWR")
99+
END IF
100+
101+
DO I=1,128
102+
DO J = 1,2
103+
IF ( PTR_CPU(I,J) /= 38 ) THEN
104+
OKAY =.FALSE.
105+
END IF
106+
END DO
107+
END DO
108+
109+
IF (.NOT. OKAY) THEN
110+
CALL FIELD_ABORT("ERROR HOST 1ST AND 2ND COLUMN OF PTR_CPU SHOULD NOT HAVE BEEN MODIFIED")
111+
END IF
112+
113+
114+
PTR_CPU(:,1) = 41
115+
PTR_CPU(:,2) = 42
116+
PTR_CPU(:,3) = 43
117+
118+
CALL F_PTR%GET_DEVICE_DATA_RDWR(PTR_GPU2)
119+
120+
!$acc serial, present(PTR_GPU2), copy(OKAY)
121+
DO J=1,3
122+
DO I=1,128
123+
IF ( PTR_GPU2(I,J) /= 40+J ) THEN
124+
OKAY = .FALSE.
125+
END IF
126+
PTR_GPU2(I,J) = I*10 + J
127+
END DO
128+
END DO
129+
!$acc end serial
130+
131+
IF (.NOT. OKAY) THEN
132+
CALL FIELD_ABORT("ERROR DEVICE DATA NOT UPDATED BY GET_DEVICE_DATA_RDWR")
133+
END IF
134+
135+
CALL F_PTR%SYNC_HOST_RDWR()
136+
DO J=1,3
137+
DO I=1,128
138+
IF ( PTR_CPU(I,J) /= I*10+J ) THEN
139+
OKAY = .FALSE.
140+
END IF
141+
END DO
142+
END DO
143+
144+
IF (.NOT. OKAY) THEN
145+
CALL FIELD_ABORT("ERROR HOST DATA NOT UPDATED BY SYNC_HOST_RDWR")
146+
END IF
147+
148+
78149
END PROGRAM TEST_GET_DEVICE_DATA_BOUNDS
79150

0 commit comments

Comments
 (0)