我正在尝试在 CUDA 中实现我自己的 64 位随机播放功能。但是,如果我这样做:
static __inline__ __device__ double __shfl_xor(double var, int laneMask, int width=warpSize)
{
int hi, lo;
asm volatile( "mov.b64 { %0, %1 }, %2;" : "=r"(lo), "=r"(hi) : "d"(var) );
hi = __shfl_xor( hi, laneMask, width );
lo = __shfl_xor( lo, laneMask, width );
return __hiloint2double( hi, lo );
}
对 __shfl_xor 的所有后续调用都将从这个 64 位版本实例化,无论参数的类型是什么。例如,如果我正在做
int a;
a = __shfl_xor( a, 16 );
它仍然会使用双重版本。解决方法可能是使用不同的函数名称。但是由于我是从模板函数中调用这个 shuffle 函数,所以使用不同的名称意味着我必须为 64 位浮点制作不同的版本,这不是很整洁。
那么如何在重载 __shfl_xor(double,...) 函数的同时仍然确保可以适当地调用 __shfl_xor(int,...) 呢?