1+ module reverse_m
2+ implicit none
3+ integer, device :: n_d
4+ contains
5+ attributes(global) subroutine staticReverse(d)
6+ real :: d(:)
7+ integer :: t, tr
8+ real, shared :: s(64)
9+ t = threadIdx%x
10+ tr = size(d)-t+1
11+ s(t) = d(t)
12+ call syncthreads()
13+ d(t) = s(tr)
14+ end subroutine staticReverse
15+
16+ attributes(global) subroutine dynamicReverse1(d)
17+ real :: d(:)
18+ integer :: t, tr
19+ real, shared :: s(*)
20+ t = threadIdx%x
21+ tr = size(d)-t+1
22+ s(t) = d(t)
23+ call syncthreads()
24+ d(t) = s(tr)
25+ end subroutine dynamicReverse1
26+
27+ attributes(global) subroutine dynamicReverse2(d, nSize)
28+ real :: d(nSize)
29+ integer, value :: nSize
30+ integer :: t, tr
31+ real, shared :: s(nSize)
32+ t = threadIdx%x
33+ tr = nSize-t+1
34+ s(t) = d(t)
35+ call syncthreads()
36+ d(t) = s(tr)
37+ end subroutine dynamicReverse2
38+
39+ attributes(global) subroutine dynamicReverse3(d)
40+ real :: d(n_d)
41+ real, shared :: s(n_d)
42+ integer :: t, tr
43+ t = threadIdx%x
44+ tr = n_d-t+1
45+ s(t) = d(t)
46+ call syncthreads()
47+ d(t) = s(tr)
48+ end subroutine dynamicReverse3
49+ end module reverse_m
50+
51+ program sharedExample
52+ use cudafor
53+ use reverse_m
54+ implicit none
55+ integer, parameter :: n = 64
56+ real :: a(n), r(n), d(n)
57+ real, device :: d_d(n)
58+ type(dim3) :: grid,threadblock
59+ integer :: i
60+
61+ threadBlock = dim3(n,1,1)
62+ grid = dim3(1,1,1)
63+ do i = 1, n
64+ a(i) = i
65+ r(i) = n-i+1
66+ enddo
67+
68+ ! run version with static shared memory
69+ d_d = a
70+ call staticReverse<<<grid,threadBlock>>>(d_d)
71+ d = d_d
72+ write(*,*) 'Static case max error:', maxval(abs(r-d))
73+
74+ ! run dynamic shared memory version 1
75+ d_d = a
76+ call dynamicReverse1<<<grid,threadBlock,4*threadBlock%x>>>(d_d)
77+ d = d_d
78+ write(*,*) 'Dynamic case 1 max error:', maxval(abs(r-d))
79+
80+ ! run dynamic shared memory version 2
81+ d_d = a
82+ call dynamicReverse2<<<grid,threadBlock,4*threadBlock%x>>>(d_d,n)
83+ d = d_d
84+ write(*,*) 'Dynamic case 2 max error:', maxval(abs(r-d))
85+
86+ ! run dynamic shared memory version 3
87+ n_d = n ! n_d declared in reverse_m
88+ d_d = a
89+ call dynamicReverse3<<<grid,threadBlock,4*threadBlock%x>>>(d_d)
90+ d = d_d
91+ write(*,*) 'Dynamic case 3 max error:', maxval(abs(r-d))
92+ end program sharedExample
0 commit comments