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 );
それはまだ二重バージョンを使用します。回避策として、別の関数名を使用している可能性があります。しかし、このシャッフル関数をテンプレート関数から呼び出しているため、別の名前を使用すると、64 ビット浮動小数点用に別のバージョンを作成する必要があり、これはあまり適切ではありません。
では、どうすれば __shfl_xor(double,...) 関数をオーバーロードしながら、同時に __shfl_xor(int,...) を適切に呼び出すことができるのでしょうか?