xref: /llvm-project/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf (revision 0469bb91aa82b331052d314de53546548e6eb060)
1b3189b13SValentin Clement (バレンタイン クレメン)! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s
27c20576cSIman Hosseini! RUN: bbc -emit-hlfir -fcuda %s -o - | fir-opt | FileCheck %s
3b3189b13SValentin Clement (バレンタイン クレメン)
4b3189b13SValentin Clement (バレンタイン クレメン)! Test lowering of CUDA kernel loop directive.
5b3189b13SValentin Clement (バレンタイン クレメン)
6b3189b13SValentin Clement (バレンタイン クレメン)subroutine sub1()
7b3189b13SValentin Clement (バレンタイン クレメン)  integer :: i, j
8b3189b13SValentin Clement (バレンタイン クレメン)  integer, parameter :: n = 100
9bd7b1621SValentin Clement (バレンタイン クレメン)  integer(8) :: istream
1016975ad2SValentin Clement (バレンタイン クレメン)  real, device :: a(n), b(n)
1116975ad2SValentin Clement (バレンタイン クレメン)  real, device :: c(n,n), d(n,n)
12b3189b13SValentin Clement (バレンタイン クレメン)
13b3189b13SValentin Clement (バレンタイン クレメン)! CHECK-LABEL: func.func @_QPsub1()
14b3189b13SValentin Clement (バレンタイン クレメン)! CHECK: %[[IV:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsub1Ei"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
15bd7b1621SValentin Clement (バレンタイン クレメン)! CHECK: %[[STREAM:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsub1Eistream"} : (!fir.ref<i64>) -> (!fir.ref<i64>, !fir.ref<i64>)
16f7245408SValentin Clement (バレンタイン クレメン)! CHECK: %[[IV_J:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsub1Ej"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
17b3189b13SValentin Clement (バレンタイン クレメン)  !$cuf kernel do <<< 1, 2 >>>
18b3189b13SValentin Clement (バレンタイン クレメン)  do i = 1, n
19b3189b13SValentin Clement (バレンタイン クレメン)    a(i) = a(i) * b(i)
20b3189b13SValentin Clement (バレンタイン クレメン)  end do
21b3189b13SValentin Clement (バレンタイン クレメン)
22b3189b13SValentin Clement (バレンタイン クレメン)! CHECK: %[[LB:.*]] = fir.convert %c1{{.*}} : (i32) -> index
23b3189b13SValentin Clement (バレンタイン クレメン)! CHECK: %[[UB:.*]] = fir.convert %c100{{.*}} : (i32) -> index
24b3189b13SValentin Clement (バレンタイン クレメン)! CHECK: %[[STEP:.*]] = arith.constant 1 : index
2545daa4fdSValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel<<<%c1_i32, %c2_i32>>> (%[[ARG0:.*]] : index) = (%[[LB]] : index) to (%[[UB]] : index)  step (%[[STEP]] : index)
26b3189b13SValentin Clement (バレンタイン クレメン)! CHECK-NOT: fir.do_loop
27b3189b13SValentin Clement (バレンタイン クレメン)! CHECK: %[[ARG0_I32:.*]] = fir.convert %[[ARG0]] : (index) -> i32
28b3189b13SValentin Clement (バレンタイン クレメン)! CHECK: fir.store %[[ARG0_I32]] to %[[IV]]#1 : !fir.ref<i32>
29f815d1f7SValentin Clement (バレンタイン クレメン)! CHECK: hlfir.assign
30b3189b13SValentin Clement (バレンタイン クレメン)
31b3189b13SValentin Clement (バレンタイン クレメン)
32b3189b13SValentin Clement (バレンタイン クレメン)  !$cuf kernel do <<< *, * >>>
33b3189b13SValentin Clement (バレンタイン クレメン)  do i = 1, n
34b3189b13SValentin Clement (バレンタイン クレメン)    a(i) = a(i) * b(i)
35b3189b13SValentin Clement (バレンタイン クレメン)  end do
36b3189b13SValentin Clement (バレンタイン クレメン)
3745daa4fdSValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel<<<*, *>>> (%{{.*}} : index) = (%{{.*}} : index) to (%{{.*}} : index)  step (%{{.*}} : index)
38b3189b13SValentin Clement (バレンタイン クレメン)
39b3189b13SValentin Clement (バレンタイン クレメン)  !$cuf kernel do(2) <<< 1, (256,1) >>>
40b3189b13SValentin Clement (バレンタイン クレメン)  do i = 1, n
41b3189b13SValentin Clement (バレンタイン クレメン)    do j = 1, n
42b3189b13SValentin Clement (バレンタイン クレメン)      c(i,j) = c(i,j) * d(i,j)
43b3189b13SValentin Clement (バレンタイン クレメン)    end do
44b3189b13SValentin Clement (バレンタイン クレメン)  end do
45b3189b13SValentin Clement (バレンタイン クレメン)
4645daa4fdSValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel<<<%c1{{.*}}, (%c256{{.*}}, %c1{{.*}})>>> (%[[ARG0:.*]] : index, %[[ARG1:.*]] : index) = (%{{.*}}, %{{.*}} : index, index) to (%{{.*}}, %{{.*}} : index, index) step (%{{.*}}, %{{.*}} : index, index)
47f7245408SValentin Clement (バレンタイン クレメン)! CHECK: %[[ARG0_I32:.*]] = fir.convert %[[ARG0]] : (index) -> i32
48f7245408SValentin Clement (バレンタイン クレメン)! CHECK: fir.store %[[ARG0_I32]] to %[[IV]]#1 : !fir.ref<i32>
49f7245408SValentin Clement (バレンタイン クレメン)! CHECK: %[[ARG1_I32:.*]] = fir.convert %[[ARG1]] : (index) -> i32
50f7245408SValentin Clement (バレンタイン クレメン)! CHECK: fir.store %[[ARG1_I32]] to %[[IV_J]]#1 : !fir.ref<i32>
51b3189b13SValentin Clement (バレンタイン クレメン)! CHECK: {n = 2 : i64}
52b3189b13SValentin Clement (バレンタイン クレメン)
53f6a2a55bSValentin Clement (バレンタイン クレメン)  !$cuf kernel do(2) <<< (1,*), (256,1) >>>
54f6a2a55bSValentin Clement (バレンタイン クレメン)  do i = 1, n
55f6a2a55bSValentin Clement (バレンタイン クレメン)    do j = 1, n
56f6a2a55bSValentin Clement (バレンタイン クレメン)      c(i,j) = c(i,j) * d(i,j)
57f6a2a55bSValentin Clement (バレンタイン クレメン)    end do
58f6a2a55bSValentin Clement (バレンタイン クレメン)  end do
5945daa4fdSValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel<<<(%c1{{.*}}, %c0{{.*}}), (%c256{{.*}}, %c1{{.*}})>>> (%{{.*}} : index, %{{.*}} : index) = (%{{.*}}, %{{.*}} : index, index) to (%{{.*}}, %{{.*}} : index, index)  step (%{{.*}}, %{{.*}} : index, index)
60f6a2a55bSValentin Clement (バレンタイン クレメン)
61f6a2a55bSValentin Clement (バレンタイン クレメン)!$cuf kernel do(2) <<< (*,*), (32,4) >>>
62f6a2a55bSValentin Clement (バレンタイン クレメン)  do i = 1, n
63f6a2a55bSValentin Clement (バレンタイン クレメン)    do j = 1, n
64f6a2a55bSValentin Clement (バレンタイン クレメン)      c(i,j) = c(i,j) * d(i,j)
65f6a2a55bSValentin Clement (バレンタイン クレメン)    end do
66f6a2a55bSValentin Clement (バレンタイン クレメン)  end do
67f6a2a55bSValentin Clement (バレンタイン クレメン)
6845daa4fdSValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel<<<*, (%c32{{.*}}, %c4{{.*}})>>> (%{{.*}} : index, %{{.*}} : index) = (%{{.*}}, %{{.*}} : index, index) to (%{{.*}}, %{{.*}} : index, index)  step (%{{.*}}, %{{.*}} : index, index)
69bd7b1621SValentin Clement (バレンタイン クレメン)
70bd7b1621SValentin Clement (バレンタイン クレメン)  !$cuf kernel do(2) <<< (*,*), (*,*), stream=istream >>>
71bd7b1621SValentin Clement (バレンタイン クレメン)  do i = 1, n
72bd7b1621SValentin Clement (バレンタイン クレメン)    do j = 1, n
73bd7b1621SValentin Clement (バレンタイン クレメン)      c(i,j) = c(i,j) * d(i,j)
74bd7b1621SValentin Clement (バレンタイン クレメン)    end do
75bd7b1621SValentin Clement (バレンタイン クレメン)  end do
76b3189b13SValentin Clement (バレンタイン クレメン)end
77bd7b1621SValentin Clement (バレンタイン クレメン)
78bd7b1621SValentin Clement (バレンタイン クレメン)! CHECK: %[[STREAM_LOAD:.*]] = fir.load %[[STREAM]]#0 : !fir.ref<i64>
79bd7b1621SValentin Clement (バレンタイン クレメン)! CHECK: %[[STREAM_I32:.*]] = fir.convert %[[STREAM_LOAD]] : (i64) -> i32
80bd7b1621SValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel<<<*, *, stream = %[[STREAM_I32]]>>>
81c81b4307SValentin Clement (バレンタイン クレメン)
82c81b4307SValentin Clement (バレンタイン クレメン)
83c81b4307SValentin Clement (バレンタイン クレメン)! Test lowering with unstructured construct inside.
84c81b4307SValentin Clement (バレンタイン クレメン)subroutine sub2(m,a,b)
85c81b4307SValentin Clement (バレンタイン クレメン)  integer :: m
86c81b4307SValentin Clement (バレンタイン クレメン)  real, device :: a(m,m), b(m)
87c81b4307SValentin Clement (バレンタイン クレメン)  integer :: i,j
88c81b4307SValentin Clement (バレンタイン クレメン)  !$cuf kernel do<<<*,*>>>
89c81b4307SValentin Clement (バレンタイン クレメン)
90c81b4307SValentin Clement (バレンタイン クレメン)  do j = 1, m
91c81b4307SValentin Clement (バレンタイン クレメン)    i = 1
92c81b4307SValentin Clement (バレンタイン クレメン)    do while (a(i,j).eq.0)
93c81b4307SValentin Clement (バレンタイン クレメン)      i = i + 1
94c81b4307SValentin Clement (バレンタイン クレメン)    end do
95c81b4307SValentin Clement (バレンタイン クレメン)    b(j) = i
96c81b4307SValentin Clement (バレンタイン クレメン)  end do
97c81b4307SValentin Clement (バレンタイン クレメン)end subroutine
98c81b4307SValentin Clement (バレンタイン クレメン)
99c81b4307SValentin Clement (バレンタイン クレメン)! CHECK-LABEL: func.func @_QPsub2
100c81b4307SValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel
101*0469bb91SValentin Clement (バレンタイン クレメン)
102*0469bb91SValentin Clement (バレンタイン クレメン)subroutine sub3()
103*0469bb91SValentin Clement (バレンタイン クレメン)  integer, device :: a(10), b(10)
104*0469bb91SValentin Clement (バレンタイン クレメン)  integer :: lb = 1
105*0469bb91SValentin Clement (バレンタイン クレメン)  integer :: n = 10
106*0469bb91SValentin Clement (バレンタイン クレメン)  integer :: s = 1
107*0469bb91SValentin Clement (バレンタイン クレメン)
108*0469bb91SValentin Clement (バレンタイン クレメン)  !$cuf kernel do <<< *, * >>>
109*0469bb91SValentin Clement (バレンタイン クレメン)  do i = lb, n, s
110*0469bb91SValentin Clement (バレンタイン クレメン)    a(i) = a(i) * b(i)
111*0469bb91SValentin Clement (バレンタイン クレメン)  end do
112*0469bb91SValentin Clement (バレンタイン クレメン)end
113*0469bb91SValentin Clement (バレンタイン クレメン)
114*0469bb91SValentin Clement (バレンタイン クレメン)! CHECK-LABEL: func.func @_QPsub3
115*0469bb91SValentin Clement (バレンタイン クレメン)! CHECK: cuf.kernel
116