【发布时间】:2017-07-20 23:48:29
【问题描述】:
所以,我想在 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));
}
它使用 "find first (bit) set" integer intrinsic 作为廉价的以 2 为底的对数函数。
注意:我可以使这个非 32 位特定,但我必须使用模板使代码复杂化,用模板函数包装 __clz() 以使用 __clzl() 和__clzll()等
问题:
- 就时钟周期而言,这种近似除法是否有更好的方法?也许有稍微不同的约束?
- 如果我想要更高的精度,我应该使用整数还是只使用浮点算术?
【问题讨论】:
标签: cuda integer-division approximate