支持`__shfl()`和`__shfl_sync()`指令的正确方法是什么?

时间:2019-04-29 21:57:19

标签: cuda ptx ptxas

据我了解,CUDA 10.1删除了shfl指令:

  

PTX ISA版本6.4删除了以下功能:

     

对于.targetsm_70及更高版本,已删除了对没有shfl限定符的.sync和投票指令的支持。自PTX ISA版本6.2中记录的PTX ISA版本6.0起,不再支持该支持。

支持shfl将来和过去的CUDA版本的正确方法是什么?

我当前的方法(在下面共享)使用CUDA 10.1导致错误:

ptxas ... line 466727; error   : Instruction 'shfl' without '.sync' is not supported on .target sm_70 and higher from PTX ISA version 6.4
template <typename T>
__device__ static __forceinline__
T _shfl_up(T var, unsigned int delta, int width=WARPSIZE, unsigned mask=MEMBERMASK)
{
#if (__CUDACC_VER_MAJOR__ >= 9)
  var = __shfl_up_sync(mask, var, delta, width);
#else
  var = __shfl_up(var, delta, width);
#endif
  return var;
}

此外,我想补充一下,我项目的依赖项之一是CUB,我相信他们使用相同的方法来拆分_sync()和旧的shfl指令。我不确定自己在做什么错。

1 个答案:

答案 0 :(得分:2)

我做对了,结果另一个依赖项不支持sync,为此创建了一个拉取请求:https://github.com/moderngpu/moderngpu/pull/32

template <typename T>
__device__ static __forceinline__
T _shfl_up(T var, unsigned int delta, int width=WARPSIZE, unsigned mask=MEMBERMASK)
{
#if ( __CUDA_ARCH__ >= 300)
#if (__CUDACC_VER_MAJOR__ >= 9)
  var = __shfl_up_sync(mask, var, delta, width);
#else
  var = __shfl_up(var, delta, width);
#endif
#endif
  return var;
}