xref: /llvm-project/flang/test/Lower/CUDA/cuda-kernel-do-reduction.cuf (revision 7665d3d90da7f32e56cb57eb192dc8f189730686)
1! Test CUDA Fortran kernel do reduction
2! RUN: bbc -emit-fir -fcuda -o - %s | FileCheck %s
3
4module mod1
5contains
6   subroutine host_sub()
7      integer, parameter :: asize = 4
8      integer, device :: adev(asize)
9      integer :: ahost(asize)
10      integer :: q
11      integer, device :: add_reduce_var
12      integer, device :: mul_reduce_var
13      ! CHECK: %[[VAL_0:.*]] = fir.declare %{{.*}} {data_attr = #cuf.cuda<device>, uniq_name = "_QMmod1Fhost_subEadd_reduce_var"} : (!fir.ref<i32>) -> !fir.ref<i32>
14      ! CHECK: %[[VAL_1:.*]] = fir.declare %{{.*}} {data_attr = #cuf.cuda<device>, uniq_name = "_QMmod1Fhost_subEmul_reduce_var"} : (!fir.ref<i32>) -> !fir.ref<i32>
15      do i = 1, asize
16         ahost(i) = i
17      enddo
18      adev = ahost
19      add_reduce_var = 0.0
20      mul_reduce_var = 1.0
21      ! CHECK: {{.*}} reduce(%[[VAL_0:.*]], %[[VAL_1:.*]] : !fir.ref<i32>, !fir.ref<i32> : [#fir.reduce_attr<add>, #fir.reduce_attr<multiply>]) {{.*}}
22      !$cuf kernel do <<< *, * >>> reduce(+:add_reduce_var) reduce(*:mul_reduce_var)
23      do i = 1, asize
24         add_reduce_var = add_reduce_var + adev(i)
25         mul_reduce_var = mul_reduce_var * adev(i)
26      end do
27      q = rsum
28      ahost = adev
29      print *, q
30   end
31end
32
33program test
34   use mod1
35   implicit none
36   call host_sub()
37end program test
38