#[inline(always)]
pub fn thread_idx_x() -> i32 {
0 }
#[inline(always)]
pub fn thread_idx_y() -> i32 {
0
}
#[inline(always)]
pub fn thread_idx_z() -> i32 {
0
}
#[inline(always)]
pub fn block_idx_x() -> i32 {
0
}
#[inline(always)]
pub fn block_idx_y() -> i32 {
0
}
#[inline(always)]
pub fn block_idx_z() -> i32 {
0
}
#[inline(always)]
pub fn block_dim_x() -> i32 {
1 }
#[inline(always)]
pub fn block_dim_y() -> i32 {
1
}
#[inline(always)]
pub fn block_dim_z() -> i32 {
1
}
#[inline(always)]
pub fn grid_dim_x() -> i32 {
1 }
#[inline(always)]
pub fn grid_dim_y() -> i32 {
1
}
#[inline(always)]
pub fn grid_dim_z() -> i32 {
1
}
#[inline(always)]
pub fn sync_threads() {
}
#[inline(always)]
pub fn thread_fence() {
std::sync::atomic::fence(std::sync::atomic::Ordering::SeqCst);
}
#[inline(always)]
pub fn thread_fence_block() {
std::sync::atomic::fence(std::sync::atomic::Ordering::Release);
}
#[inline(always)]
pub fn sqrt(x: f32) -> f32 {
x.sqrt()
}
#[inline(always)]
pub fn rsqrt(x: f32) -> f32 {
1.0 / x.sqrt()
}
#[inline(always)]
pub fn floor(x: f32) -> f32 {
x.floor()
}
#[inline(always)]
pub fn ceil(x: f32) -> f32 {
x.ceil()
}
#[inline(always)]
pub fn round(x: f32) -> f32 {
x.round()
}
#[inline(always)]
pub fn sin(x: f32) -> f32 {
x.sin()
}
#[inline(always)]
pub fn cos(x: f32) -> f32 {
x.cos()
}
#[inline(always)]
pub fn tan(x: f32) -> f32 {
x.tan()
}
#[inline(always)]
pub fn exp(x: f32) -> f32 {
x.exp()
}
#[inline(always)]
pub fn log(x: f32) -> f32 {
x.ln()
}
#[inline(always)]
pub fn fma(a: f32, b: f32, c: f32) -> f32 {
a.mul_add(b, c)
}
#[inline(always)]
pub fn powf(x: f32, y: f32) -> f32 {
x.powf(y)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_thread_indices() {
assert_eq!(thread_idx_x(), 0);
assert_eq!(thread_idx_y(), 0);
assert_eq!(thread_idx_z(), 0);
}
#[test]
fn test_block_indices() {
assert_eq!(block_idx_x(), 0);
assert_eq!(block_idx_y(), 0);
assert_eq!(block_idx_z(), 0);
}
#[test]
fn test_dimensions() {
assert_eq!(block_dim_x(), 1);
assert_eq!(block_dim_y(), 1);
assert_eq!(block_dim_z(), 1);
assert_eq!(grid_dim_x(), 1);
assert_eq!(grid_dim_y(), 1);
assert_eq!(grid_dim_z(), 1);
}
#[test]
fn test_sync_compiles() {
sync_threads();
thread_fence();
thread_fence_block();
}
#[test]
fn test_math_functions() {
assert!((sqrt(4.0) - 2.0).abs() < 1e-6);
assert!((rsqrt(4.0) - 0.5).abs() < 1e-6);
assert_eq!(floor(3.7), 3.0);
assert_eq!(ceil(3.2), 4.0);
assert_eq!(round(3.5), 4.0);
assert!((sin(0.0)).abs() < 1e-6);
assert!((cos(0.0) - 1.0).abs() < 1e-6);
assert!((tan(0.0)).abs() < 1e-6);
assert!((exp(0.0) - 1.0).abs() < 1e-6);
assert!((log(1.0)).abs() < 1e-6);
assert!((fma(2.0, 3.0, 1.0) - 7.0).abs() < 1e-6);
assert!((powf(2.0, 3.0) - 8.0).abs() < 1e-6);
}
}