[flang][cuda] Allow ieee_arithmetic on the device (#131930)

- Allow ieee_arithmetic on the device
- Add ignore_tkr(d) to ieee_is_finite
This commit is contained in:
Valentin Clement (バレンタイン クレメン) 2025-03-19 07:20:06 -07:00 committed by GitHub
parent ade22fc1d9
commit 20feca47c1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 21 additions and 0 deletions

View File

@ -82,6 +82,14 @@ struct DeviceExprChecker
}
}
}
const Symbol &ultimate{sym->GetUltimate()};
const Scope &scope{ultimate.owner()};
const Symbol *mod{scope.IsModule() ? scope.symbol() : nullptr};
// Allow ieee_arithmetic module functions to be called on the device.
// TODO: Check for unsupported ieee_arithmetic on the device.
if (mod && mod->name() == "ieee_arithmetic") {
return {};
}
} else if (x.GetSpecificIntrinsic()) {
// TODO(CUDA): Check for unsupported intrinsics here
return {};

View File

@ -339,6 +339,7 @@ module ieee_arithmetic
#define IEEE_IS_FINITE_R(XKIND) \
elemental logical function ieee_is_finite_a##XKIND(x); \
real(XKIND), intent(in) :: x; \
!dir$ ignore_tkr(d) x; \
end function ieee_is_finite_a##XKIND;
interface ieee_is_finite
SPECIFICS_R(IEEE_IS_FINITE_R)

View File

@ -209,3 +209,15 @@ subroutine host1()
a(i) = a(i) + a(j) - 34.0
end do
end
subroutine ieee_test
use ieee_arithmetic
real(8), device :: y(100)
logical(4), managed :: ll(100)
!$cuf kernel do(1)<<<*,*>>>
do i = 1, 100
ll(i) = ieee_is_finite(y(i)) ! allow ieee_arithmetic functions on the device.
end do
end subroutine