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