Skip to content

Commit 692f464

Browse files
committed
added missing shared.cuf
1 parent 8110cfc commit 692f464

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

series/cuda-fortran/shared.cuf

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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

Comments
 (0)