9#ifndef FZ_ANS_DIETGPU_UTILS_PTXUTILS_H
10#define FZ_ANS_DIETGPU_UTILS_PTXUTILS_H
16namespace fz {
namespace ans {
18__device__ __forceinline__
int getLaneId() {
20 asm(
"mov.u32 %0, %%laneid;" :
"=r"(laneId));
24__device__ __forceinline__
unsigned getLaneMaskLt() {
26 asm(
"mov.u32 %0, %%lanemask_lt;" :
"=r"(mask));
30__device__ __forceinline__
unsigned getLaneMaskLe() {
32 asm(
"mov.u32 %0, %%lanemask_le;" :
"=r"(mask));
36__device__ __forceinline__
unsigned getLaneMaskGt() {
38 asm(
"mov.u32 %0, %%lanemask_gt;" :
"=r"(mask));
42__device__ __forceinline__
unsigned getLaneMaskGe() {
44 asm(
"mov.u32 %0, %%lanemask_ge;" :
"=r"(mask));
48template <
typename T,
int W
idth = kWarpSize>
49__device__
inline T warpReduceAllSum(T val) {
50#if __CUDA_ARCH__ >= 800
51 return __reduce_add_sync(0xffffffff, val);
54 for (
int mask = Width / 2; mask > 0; mask >>= 1) {
55 val += __shfl_xor_sync(0xffffffff, val, mask, kWarpSize);