Cuda 支持`\u shfl()`和`\u shfl\u sync()`指令的正确方法是什么?

Cuda 支持`\u shfl()`和`\u shfl\u sync()`指令的正确方法是什么?,cuda,ptx,ptxas,Cuda,Ptx,Ptxas,据我所知,CUDA 10.1删除了shfl说明: PTX ISA 6.4版删除了以下功能: 对于.targetsm_70及更高版本,已删除对不带.sync限定符的shfl和投票指令的支持。自PTX ISA 6.2版中记录的PTX ISA 6.0版以来,此支持已被弃用 支持未来和过去CUDA版本的正确方法是什么 我当前的方法(以下共享)导致使用CUDA 10.1时出现错误: ptxas ... line 466727; error : Instruction 'shfl' without '.

据我所知,CUDA 10.1删除了
shfl
说明:

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

对于.targetsm_70及更高版本,已删除对不带
.sync
限定符的shfl和投票指令的支持。自PTX ISA 6.2版中记录的PTX ISA 6.0版以来,此支持已被弃用

支持未来和过去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
模板
__设备\静态\强制在线__
T_shfl_up(T var,无符号整数增量,整数宽度=WARPSIZE,无符号掩码=成员掩码)
{
#如果(uuu CUDACC_uver_uuumajor_uuuu>=9)
var=uuu shfl_uup_usync(掩码、var、增量、宽度);
#否则
var=(var,delta,width);
#恩迪夫
收益var;
}

另外,我想补充一点,我的项目的一个依赖项是,我相信它们使用相同的方法来拆分
\u sync()
和较旧的
shfl
指令。我不确定我做错了什么。

我做了正确的事情,结果发现另一个依赖项不支持
sync
,为它创建了一个拉取请求:

模板
__设备\静态\强制在线__
T_shfl_up(T var,无符号整数增量,整数宽度=WARPSIZE,无符号掩码=成员掩码)
{
#如果(\uuuu CUDA\u ARCH\uuuuu>=300)
#如果(uuu CUDACC_uver_uuumajor_uuuu>=9)
var=uuu shfl_uup_usync(掩码、var、增量、宽度);
#否则
var=(var,delta,width);
#恩迪夫
#恩迪夫
收益var;
}
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;
}
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;
}