From fda2ead377832febf07997469521736221e6f367 Mon Sep 17 00:00:00 2001 From: gnzlbg Date: Thu, 16 Nov 2017 10:25:09 +0100 Subject: [PATCH] add nvptx architecture --- library/stdarch/src/lib.rs | 4 ++ library/stdarch/src/nvptx/mod.rs | 109 +++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 library/stdarch/src/nvptx/mod.rs diff --git a/library/stdarch/src/lib.rs b/library/stdarch/src/lib.rs index 685dbef092fa..b8670c8d5231 100644 --- a/library/stdarch/src/lib.rs +++ b/library/stdarch/src/lib.rs @@ -153,6 +153,8 @@ pub mod vendor { #[cfg(target_arch = "aarch64")] pub use aarch64::*; + + pub use nvptx::*; } #[macro_use] @@ -205,3 +207,5 @@ mod x86; mod arm; #[cfg(target_arch = "aarch64")] mod aarch64; + +mod nvptx; diff --git a/library/stdarch/src/nvptx/mod.rs b/library/stdarch/src/nvptx/mod.rs new file mode 100644 index 000000000000..f99f7ac1bad6 --- /dev/null +++ b/library/stdarch/src/nvptx/mod.rs @@ -0,0 +1,109 @@ +//! nvptx intrinsics + +#[allow(improper_ctypes)] +extern "C" { + #[link_name = "llvm.cuda.syncthreads"] + fn syncthreads() -> (); + #[link_name = "llvm.nvvm.read.ptx.sreg.ntid.x"] + fn block_dim_x() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.ntid.y"] + fn block_dim_y() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.ntid.z"] + fn block_dim_z() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.ctaid.x"] + fn block_idx_x() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.ctaid.y"] + fn block_idx_y() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.ctaid.z"] + fn block_idx_z() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.nctaid.x"] + fn grid_dim_x() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.nctaid.y"] + fn grid_dim_y() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.nctaid.z"] + fn grid_dim_z() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.tid.x"] + fn thread_idx_x() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.tid.y"] + fn thread_idx_y() -> i32; + #[link_name = "llvm.nvvm.read.ptx.sreg.tid.z"] + fn thread_idx_z() -> i32; +} + +/// Synchronizes all threads in the block. +#[inline(always)] +pub unsafe fn _syncthreads() -> () { + syncthreads() +} + +/// x-th thread-block dimension. +#[inline(always)] +pub unsafe fn _block_dim_x() -> i32 { + block_dim_x() +} + +/// y-th thread-block dimension. +#[inline(always)] +pub unsafe fn _block_dim_y() -> i32 { + block_dim_y() +} + +/// z-th thread-block dimension. +#[inline(always)] +pub unsafe fn _block_dim_z() -> i32 { + block_dim_z() +} + +/// x-th thread-block index. +#[inline(always)] +pub unsafe fn _block_idx_x() -> i32 { + block_idx_x() +} + +/// y-th thread-block index. +#[inline(always)] +pub unsafe fn _block_idx_y() -> i32 { + block_idx_y() +} + +/// z-th thread-block index. +#[inline(always)] +pub unsafe fn _block_idx_z() -> i32 { + block_idx_z() +} + +/// x-th block-grid dimension. +#[inline(always)] +pub unsafe fn _grid_dim_x() -> i32 { + grid_dim_x() +} + +/// y-th block-grid dimension. +#[inline(always)] +pub unsafe fn _grid_dim_y() -> i32 { + grid_dim_y() +} + +/// z-th block-grid dimension. +#[inline(always)] +pub unsafe fn _grid_dim_z() -> i32 { + grid_dim_z() +} + +/// x-th thread index. +#[inline(always)] +pub unsafe fn _thread_idx_x() -> i32 { + thread_idx_x() +} + +/// y-th thread index. +#[inline(always)] +pub unsafe fn _thread_idx_y() -> i32 { + thread_idx_y() +} + +/// z-th thread index. +#[inline(always)] +pub unsafe fn _thread_idx_z() -> i32 { + thread_idx_z() +}