[flang-commits] [flang] [flang][cuda] Emit error when host array is used in CUF kernel (PR #100693)
via flang-commits
flang-commits at lists.llvm.org
Thu Jul 25 22:19:53 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Valentin Clement (バレンタイン クレメン) (clementval)
<details>
<summary>Changes</summary>
Restriction from the standard 2.11.2.
Arrays used or assigned in the loop must have the device, managed or unifed attribute.
---
Full diff: https://github.com/llvm/llvm-project/pull/100693.diff
6 Files Affected:
- (modified) flang/lib/Semantics/check-cuda.cpp (+32)
- (modified) flang/test/Lower/CUDA/cuda-data-transfer.cuf (+1-1)
- (modified) flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf (+2-2)
- (modified) flang/test/Parser/cuf-sanity-common (+2-1)
- (modified) flang/test/Semantics/cuf09.cuf (+10)
- (modified) flang/test/Semantics/reduce.cuf (+3-3)
``````````diff
diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index 5b3ea214d63e9..60b8b3213fdb8 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -307,6 +307,25 @@ template <bool IsCUFKernelDo> class DeviceContextChecker {
WarnOnIoStmt(source);
}
}
+ template <typename A>
+ void ErrorIfHostSymbol(const A &expr, const parser::CharBlock &source) {
+ for (const Symbol &sym : CollectCudaSymbols(expr)) {
+ if (const auto *details =
+ sym.GetUltimate().detailsIf<semantics::ObjectEntityDetails>()) {
+ if (details->IsArray() &&
+ (!details->cudaDataAttr() ||
+ (details->cudaDataAttr() &&
+ *details->cudaDataAttr() != common::CUDADataAttr::Device &&
+ *details->cudaDataAttr() != common::CUDADataAttr::Managed &&
+ *details->cudaDataAttr() !=
+ common::CUDADataAttr::Unified))) {
+ context_.Say(source,
+ "Host array '%s' cannot be present in CUF kernel"_err_en_US,
+ sym.name());
+ }
+ }
+ }
+ }
void Check(const parser::ActionStmt &stmt, const parser::CharBlock &source) {
common::visit(
common::visitors{
@@ -349,6 +368,19 @@ template <bool IsCUFKernelDo> class DeviceContextChecker {
[&](const common::Indirection<parser::IfStmt> &x) {
Check(x.value());
},
+ [&](const common::Indirection<parser::AssignmentStmt> &x) {
+ if (IsCUFKernelDo) {
+ const evaluate::Assignment *assign{
+ semantics::GetAssignment(x.value())};
+ if (assign) {
+ ErrorIfHostSymbol(assign->lhs, source);
+ ErrorIfHostSymbol(assign->rhs, source);
+ }
+ }
+ if (auto msg{ActionStmtChecker<IsCUFKernelDo>::WhyNotOk(x)}) {
+ context_.Say(source, std::move(*msg));
+ }
+ },
[&](const auto &x) {
if (auto msg{ActionStmtChecker<IsCUFKernelDo>::WhyNotOk(x)}) {
context_.Say(source, std::move(*msg));
diff --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
index d657f819dfbf1..7eb74a4234f5a 100644
--- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
@@ -133,7 +133,7 @@ subroutine sub4()
integer, parameter :: n = 10
real, device :: adev(n)
real :: ahost(n)
- real :: b
+ real, managed :: b
integer :: i
adev = ahost
diff --git a/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf b/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf
index 99cb6eb289e0b..ba5d390df4785 100644
--- a/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf
+++ b/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf
@@ -7,8 +7,8 @@ subroutine sub1()
integer :: i, j
integer, parameter :: n = 100
integer(8) :: istream
- real :: a(n), b(n)
- real :: c(n,n), d(n,n)
+ real, device :: a(n), b(n)
+ real, device :: c(n,n), d(n,n)
! CHECK-LABEL: func.func @_QPsub1()
! CHECK: %[[IV:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsub1Ei"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
diff --git a/flang/test/Parser/cuf-sanity-common b/flang/test/Parser/cuf-sanity-common
index 9d73204e3f5f6..9341f054d79d4 100644
--- a/flang/test/Parser/cuf-sanity-common
+++ b/flang/test/Parser/cuf-sanity-common
@@ -23,7 +23,8 @@ module m
end subroutine
subroutine test
logical isPinned
- real a(10), x, y, z
+ real, device :: a(10)
+ real :: x, y, z
!$cuf kernel do(1) <<<*, *, stream = 1>>>
do j = 1, 10
end do
diff --git a/flang/test/Semantics/cuf09.cuf b/flang/test/Semantics/cuf09.cuf
index d2d4d239815e4..195ddac11d575 100644
--- a/flang/test/Semantics/cuf09.cuf
+++ b/flang/test/Semantics/cuf09.cuf
@@ -18,6 +18,8 @@ module m
end
program main
+ integer, device :: a_d(10 ,10)
+ integer :: b(10, 10)
!$cuf kernel do <<< *, * >>> ! ok
do j = 1, 0
end do
@@ -90,4 +92,12 @@ program main
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 CUF kernel
+ a_d(i,j) = b(i,j)
+ enddo
+ enddo
end
diff --git a/flang/test/Semantics/reduce.cuf b/flang/test/Semantics/reduce.cuf
index 95ff2e87c09b4..92d12ab149010 100644
--- a/flang/test/Semantics/reduce.cuf
+++ b/flang/test/Semantics/reduce.cuf
@@ -1,9 +1,9 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
subroutine s(n,m,a,l)
integer, intent(in) :: n
- integer, intent(in) :: m(n)
- real, intent(in) :: a(n)
- logical, intent(in) :: l(n)
+ integer, device, intent(in) :: m(n)
+ real, device, intent(in) :: a(n)
+ logical, device, intent(in) :: l(n)
integer j, mr
real ar
logical lr
``````````
</details>
https://github.com/llvm/llvm-project/pull/100693
More information about the flang-commits
mailing list