我在GPU设备上工作,它具有非常高的除法整数延迟,数百个周期。我正在寻找优化部门。
所有除法的分母在集合{ 1,3,6,10 }中,但是分子是运行时的正值,大约为32000或更小。由于内存的限制,查找表可能不是一个好的选择。
你能想出别的办法吗?我想过计算浮点求逆,并用它们来乘以分子。
谢谢
PS。谢谢大家。bit shift hack真的很酷。为了从舍入中恢复,我使用以下C段:
// q = m/n
q += (n*(j +1)-1) < m;发布于 2010-04-11 12:54:33
a/b=a*(1/b)
x=(1<<16)/b
a/b=(a*x)>>16你能为分母建立一个查询表吗?既然你说的是15位分子,如果所有的东西都是32位无符号的,你可以用17来表示移位:
a/b=a*((1<<17)/b)>>17移位越大,舍入误差越小。您可以进行暴力检查,看看有多少次,如果有的话,这实际上是错误的。
发布于 2010-04-11 14:16:44
"Hacker's Delight" by Henry Warren这本书用了整整一章的篇幅讲述了整数的常量除法,包括将整数除法转换为乘法/移位/加法一系列操作的技术。
本页计算乘法/移位/加法运算的幻数:
发布于 2010-04-11 12:52:29
为此,标准的嵌入式系统技巧是将整数除以N转换为定点乘以1/N。
假设16位,则可以用21845 (十进制)表示0.33333。乘法,得到32位整数乘积,然后向下移位16位。
您几乎肯定会遇到一些舍入(截断)错误。这可能是你能接受的,也可能不是。
这可能是值得努力研究您的GPU,看看您是否可以手动编写一个更快的整数除法例程,利用您的知识分子的有限范围。
https://stackoverflow.com/questions/2616072
复制相似问题