-
Notifications
You must be signed in to change notification settings - Fork 16
/
acc_deviceptr.F90
78 lines (68 loc) · 1.83 KB
/
acc_deviceptr.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef T1
!T1:runtime,data,executable-data,construct-independent,V:3.3
LOGICAL FUNCTION test1()
USE OPENACC
IMPLICIT NONE
INCLUDE "acc_testsuite.Fh"
REAL(8), DIMENSION(LOOPCOUNT) :: a, b, c !Data
REAL(8), POINTER, DIMENSION(:) :: a_ptr, b_ptr, d_ptr
INTEGER :: errors = 0
INTEGER, value :: x, i
!Initilization
SEEDDIM(1) = 1
#ifdef SEED
SEEDDIM(1) = SEED
#endif
CALL RANDOM_SEED(PUT=SEEDDIM)
CALL RANDOM_NUMBER(a)
CALL RANDOM_NUMBER(b)
DO i = 1, LOOPCOUNT
c(i) = 0
END DO
!$acc enter data copyin(a(0:n), b(0:n)) create(c(0:n))
a_ptr = acc_deviceptr(a)
b_ptr = acc_deviceptr(b)
d_ptr = acc_deviceptr(c)
!$acc data deviceptr(a_ptr, b_ptr, c_ptr)
!$acc parallel
!$acc loop
DO x = 0, LOOPCOUNT
d_ptr(x) = a_ptr(x) + b_ptr(x);
END DO
!$acc end loop
!$acc end parallel
!$acc end data
!$acc exit data copyout(c(0:n)) delete(a(0:n), b(0:n))
DO x = 0, LOOPCOUNT
IF (ABS(c(x) - (a(x) + b(x))) .gt. PRECISION) THEN
errors = errors + 1
END IF
END DO
IF (errors .eq. 0) THEN
test1 = .FALSE.
ELSE
test1 = .TRUE.
END IF
END
#endif
PROGRAM main
IMPLICIT NONE
INTEGER :: failcode, testrun
LOGICAL :: failed
INCLUDE "acc_testsuite.Fh"
#ifndef T1
LOGICAL :: test1
#endif
failed = .FALSE.
failcode = 0
#ifndef T1
DO testrun = 1, NUM_TEST_CALLS
failed = failed .or. test1()
END DO
IF (failed) THEN
failcode = failcode + 2 ** 0
failed = .FALSE.
END IF
#endif
CALL EXIT (failcode)
END PROGRAM