gpu/
device_intrinsic.rs

1/// This module provides missing GPU intrinsics provided by "libdevice.10.bc".
2/// Some intrinsics are defined in Rust vstd but not all of them.
3/// Refer to /usr/local/cuda/nvvm/libdevice/libdevice.10.bc
4macro_rules! impl_dev_intrinsics {
5    ($name:ident, $t: ty) => {
6        #[inline(never)]
7        #[rustc_diagnostic_item = concat!("gpu::device_intrinsics::", stringify!($name))]
8        #[gpu_codegen::device]
9        fn $name(self) -> $t {
10            unimplemented!()
11        }
12    };
13}
14
15macro_rules! impl_dev_intrinsics3 {
16    ($name:ident, $t: ty) => {
17        #[inline(never)]
18        #[rustc_diagnostic_item = concat!("gpu::device_intrinsics::", stringify!($name))]
19        #[gpu_codegen::device]
20        fn $name(self, _y: $t, _z: $t) -> $t {
21            unimplemented!()
22        }
23    };
24}
25
26/// codegen_test cannot find rust/deps/compiler_builtins-0.1.152.
27macro_rules! impl_dev_intrinsics_for_core {
28    () => {
29        impl_dev_intrinsics!(max, Self);
30        impl_dev_intrinsics!(min, Self);
31        impl_dev_intrinsics!(sqrt, Self);
32        impl_dev_intrinsics!(ceil, Self);
33        impl_dev_intrinsics!(exp, Self);
34        impl_dev_intrinsics!(exp2, Self);
35        impl_dev_intrinsics!(sin, Self);
36        impl_dev_intrinsics!(cos, Self);
37        impl_dev_intrinsics!(log, Self);
38    };
39}
40
41/// This trait provides the device intrinsics for floating-point types
42/// that are not defined by Rust core::intrinsics.
43pub trait GPUDeviceFloatIntrinsics: Sized {
44    impl_dev_intrinsics3!(fma, Self);
45    impl_dev_intrinsics!(rsqrt, Self);
46    impl_dev_intrinsics!(expm1, Self);
47    impl_dev_intrinsics!(sinh, Self);
48    impl_dev_intrinsics!(cosh, Self);
49    impl_dev_intrinsics!(tan, Self);
50    impl_dev_intrinsics!(tanh, Self);
51    impl_dev_intrinsics!(pow, Self);
52    impl_dev_intrinsics!(log10, Self);
53    impl_dev_intrinsics!(log1p, Self);
54    impl_dev_intrinsics!(log2, Self);
55    impl_dev_intrinsics_for_core!();
56}
57
58impl GPUDeviceFloatIntrinsics for f32 {}
59impl GPUDeviceFloatIntrinsics for f64 {}