Cuda GPU上廉价的近似整数除法

Cuda GPU上廉价的近似整数除法,cuda,integer-division,approximate,Cuda,Integer Division,Approximate,所以,我想在GPU上除以一些32位无符号整数,我不关心得到精确的结果。事实上,让我们宽容一点,假设我愿意接受一个高达2的乘法误差因子,也就是说,如果q=x/y,我愿意接受0.5*q和2*q之间的任何值 我还没有测量任何东西,但在我看来,类似这样的东西(CUDA代码)应该很有用: __device__ unsigned cheap_approximate_division(unsigned dividend, unsigned divisor) { return 1u << (

所以,我想在GPU上除以一些32位无符号整数,我不关心得到精确的结果。事实上,让我们宽容一点,假设我愿意接受一个高达2的乘法误差因子,也就是说,如果q=x/y,我愿意接受0.5*q和2*q之间的任何值

我还没有测量任何东西,但在我看来,类似这样的东西(CUDA代码)应该很有用:

__device__ unsigned cheap_approximate_division(unsigned dividend, unsigned divisor)
{
    return 1u << (__clz(dividend) - __clz(divisor));
}
\uuuuu设备\uuuuu无符号廉价\uu近似除法(无符号除法、无符号除法)
{

return 1u通过浮点运算可获得更精确的结果,在大多数体系结构上指令数略低,吞吐量可能更高:

__device__ unsigned cheap_approximate_division(unsigned dividend, unsigned divisor)
{
   return (unsigned)(__fdividef(dividend, divisor) /*+0.5f*/ );
}

注释中的
+0.5f
应表明,您还可以将浮点->整数转换为适当的舍入,而基本上不需要花费任何成本,只需消耗更高的能量(它将
fmul
转换为
fmad
,常数直接来自常数缓存)但是,舍入将使您远离精确的整数结果。

通过浮点运算可以获得更精确的结果,在大多数体系结构中,指令数略低,吞吐量可能更高:

__device__ unsigned cheap_approximate_division(unsigned dividend, unsigned divisor)
{
   return (unsigned)(__fdividef(dividend, divisor) /*+0.5f*/ );
}

注释中的
+0.5f
应表明,您还可以将浮点->整数转换为适当的舍入,而基本上不需要花费任何成本,只需消耗更高的能量(它将
fmul
转换为
fmad
,常数直接来自常数缓存)。舍入将使您远离精确的整数结果。

您能在这里抛出一些循环计数吗?假设我使用的所有整数运算都是每个扭曲1个循环,并且所有内容都在寄存器中,那么我应该只使用4个;这个版本有多少个循环?抱歉,您必须对自己的atm进行基准测试。但是请记住at.您针对的是特定的体系结构吗?@einpoklum如果您迁移到opencl for GCN,它也会在后端模拟fp的整数除法。fp必须是最快的选项。您能在这里抛出一些循环计数吗?假设我使用的所有整数操作都是每个扭曲1个循环,并且所有内容都在寄存器中,那么我应该只使用4个;有多少个cycles是这个版本吗?抱歉,您必须对自己的atm进行基准测试。但是请记住。您是针对特定的体系结构吗?@einpoklum如果您迁移到opencl for GCN,它也会在后端模拟fp的整数除法。fp必须是最快的选项。