File: cuf09.cuf

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.8-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,696 kB
  • sloc: cpp: 7,438,781; ansic: 1,393,871; asm: 1,012,926; python: 241,771; f90: 86,635; objc: 75,411; lisp: 42,144; pascal: 17,286; sh: 8,596; ml: 5,082; perl: 4,730; makefile: 3,591; awk: 3,523; javascript: 2,251; xml: 892; fortran: 672
file content (194 lines) | stat: -rw-r--r-- 4,999 bytes parent folder | download | duplicates (2)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
! RUN: %python %S/test_errors.py %s %flang_fc1
module m
 integer :: m(100)
 integer, constant :: c(10)
 integer, parameter :: p(5) = [1,2,3,4,5]
 contains
  attributes(device) subroutine devsub
    !ERROR: Statement may not appear in device code
    !$cuf kernel do <<< 1, 2 >>>
    do k=1,10
    end do
  end
  attributes(device) subroutine devsub2
    real, device :: x(10)
    print*,'from device'
    print '(f10.5)', (x(ivar), ivar = 1, 10)
    write(*,*), "Hello world from device!"
    !WARNING: I/O statement might not be supported on device
    write(12,'(10F4.1)'), x
  end
  attributes(global) subroutine hostglobal(a)
    integer :: a(*)
    i = threadIdx%x
    !ERROR: Host array 'm' cannot be present in device context
    if (i .le. N) a(i) = m(i)
  end subroutine

  attributes(global) subroutine hostparameter(a)
    integer :: a(*)
    i = threadIdx%x
    if (i .le. N) a(i) = p(i) ! ok. p is parameter
  end subroutine

  attributes(global) subroutine localarray()
    integer :: a(10)
    i = threadIdx%x
    a(i) = i
  end subroutine

  attributes(global) subroutine sharedarray(a)
    integer, device :: a(10)
    integer, shared :: s(10)
    i = threadIdx%x
    a(i) = s(10) ! ok, a is device and s is shared
  end subroutine

  attributes(global) subroutine cstarray(a)
    integer, device :: a(10)
    i = threadIdx%x
    a(i) = c(10) ! ok, a is device and c is constant
  end subroutine

  attributes(global) subroutine stoptest()
    print*,threadIdx%x
    stop ! ok
  end subroutine

  attributes(global) subroutine cycletest()
    integer :: i
    do i = 1, 10
      cycle ! ok
    end do
  end subroutine

  attributes(global) subroutine gototest()
    integer :: i
    goto 10
    10 print *, "X is negative!" 
  end subroutine

  attributes(global) subroutine exittest()
    integer :: i
    do i = 1, 10
      if (i == 1) then
        exit ! ok
      end if
    end do
  end subroutine

  attributes(global) subroutine selectcasetest()
    integer :: i
    select case(i)
    case (1)
      print*,'main'
    case default
      print*, 'default'
    end select
  end subroutine

  subroutine host()
    integer :: i
    !$cuf kernel do
    do i = 1, 10
      !ERROR: Statement may not appear in cuf kernel code
      cycle
    end do

    !$cuf kernel do
    do i = 1, 10
      if (i == 1) then
        !ERROR: Statement may not appear in cuf kernel code
        exit ! ok
      end if

      !ERROR: Statement may not appear in cuf kernel code
      goto 10
      10 print *, "X is negative!"
    end do
  end subroutine
end

program main
  integer, device :: a_d(10 ,10)
  integer :: b(10, 10)
  !$cuf kernel do <<< *, * >>> ! ok
  do j = 1, 0
  end do
  !$cuf kernel do <<< (*), (*) >>> ! ok
  do j = 1, 0
  end do
  !$cuf kernel do <<< (1,*), (2,*) >>> ! ok
  do j = 1, 0
  end do
  !ERROR: !$CUF KERNEL DO (1) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do <<< 1, 2 >>>
  do while (.false.)
  end do
  !ERROR: !$CUF KERNEL DO (1) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do <<< 1, 2 >>>
  do
    exit
  end do
  !$cuf kernel do <<< 1, 2 >>>
  do concurrent (j=1:10)
  end do
  !$cuf kernel do <<< 1, 2 >>>
  do 1 j=1,10
1 continue ! ok
  !$cuf kernel do <<< 1, 2 >>>
  do j=1,10
  end do ! ok
  !$cuf kernel do <<< 1, 2 >>>
  do j=1,10
    !ERROR: Statement may not appear in device code
    !$cuf kernel do <<< 1, 2 >>>
    do k=1,10
    end do
  end do
  !ERROR: !$CUF KERNEL DO (-1): loop nesting depth must be positive
  !$cuf kernel do (-1) <<< 1, 2 >>>
  do j=1,10
  end do
  !ERROR: !$CUF KERNEL DO (1) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do <<< 1, 2 >>>
  continue
  !ERROR: !$CUF KERNEL DO (2) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do (2) <<< 1, 2 >>>
  do j=1,10
  end do
  !ERROR: !$CUF KERNEL DO (2) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do (2) <<< 1, 2 >>>
  do j=1,10
    continue
  end do
  !ERROR: !$CUF KERNEL DO (2) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do (2) <<< 1, 2 >>>
  do j=1,10
    do k=1,10
    end do
    continue
  end do
  !$cuf kernel do <<< 1, 2 >>>
  do j = 1, 10
    !ERROR: 'foo' may not be called in device code
    call foo
    !ERROR: 'bar' may not be called in device code
    x = bar()
    !ERROR: 'ifunc' may not be called in device code
    if (ifunc() /= 0) continue
    !ERROR: 'ifunc' may not be called in device code
    if (ifunc() /= 0) then
    !ERROR: 'ifunc' may not be called in device code
    else if (ifunc() /= 1) then
    end if
  end do

  !$cuf kernel do (2) <<<*, *>>>
  do j = 1, 10
     do i = 1, 10
        !ERROR: Host array 'b' cannot be present in device context
        a_d(i,j) = b(i,j)
     enddo
  enddo
end