当分母已知时,更快的整数除法?

时间:2010-04-11 04:42:42

标签: performance optimization integer division

我正在开发具有非常高的分割整数延迟,数百个周期的GPU设备。我希望优化分工。

分母中的所有除法在集合{1,3,6,10}中,但分子是运行时正值,大约为32000或更小。由于内存限制,查找表可能不是一个好的选择。

你能想到其他选择吗? 我曾想过计算浮点反转,并使用它们来乘以分子。

由于

PS。谢谢你们。位移黑客真的很酷。 为了从舍入中恢复,我使用以下C段:

// q = m/n
q += (n*(j +1)-1) < m;

3 个答案:

答案 0 :(得分:9)

a/b=a*(1/b)
x=(1<<16)/b
a/b=(a*x)>>16

你能为分母建立一个查找表吗?因为你说15位分子,如果所有的都是无符号的32位,你可以使用17作为移位:

a/b=a*((1<<17)/b)>>17

移位越大,舍入误差越小。您可以进行暴力检查,看看实际上有多少次,如果有的话。

答案 1 :(得分:6)

标准的嵌入式系统破解的是将整数除以N转换为定点乘以1 / N.

假设16位,0.33333可以表示为21845(十进制)。乘以,得到一个32位整数乘积,并向下移16位。

您几乎肯定会遇到一些舍入(截断)错误。这可能是也可能不是你可以忍受的东西。

可能值得仔细研究你的GPU,看看你是否可以手动编写更快的整数除法程序,利用你对分子限制范围的了解。

答案 2 :(得分:6)

这本书"Hacker's Delight" by Henry Warren有一整章专门用于按常数进行整数除法,包括将整数除法转换为乘法/移位/加法运算系列的技术。

此页面计算乘法/移位/添加操作的幻数: