Я пытаюсь реализовать свою собственную 64-битную функцию перемешивания в CUDA. Однако, если я сделаю это так:
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,...) можно вызвать соответствующим образом?