【发布时间】:2010-10-25 17:32:18
【问题描述】:
我需要在我的代码的热路径中执行一些整数除法。我已经通过分析和循环计数确定整数除法正在花费我。我希望我可以做一些事情来加强将师减少到更便宜的东西。
在这条路径中,我除以 2^n+1,其中 n 是可变的。本质上我想优化此功能以删除除法运算符:
unsigned long compute(unsigned long a, unsigned int n)
{
return a / ((1 << n) + 1);
}
如果我除以 2^n,我只需将 div 替换为右移 n。如果我除以一个常数,我会让编译器的强度降低那个特定的除法,很可能把它变成一个乘法和一些移位。
是否有适用于 2^n+1 的类似优化?
编辑:这里的 a 可以是任意 64 位整数。 n 只取 10 到 25 之间的几个值。我当然可以为每个 n 预先计算一些值,但不能为 a。
【问题讨论】:
-
对a和n的值有什么限制吗?
-
你调用函数的上下文是什么?
-
@JR,我看不出转变是问题所在——这是一条指令。这是需要时间的分裂
-
如果
a是一个 64 位整数,你应该这样声明它。unsigned long只保证有 32 位。使用uint64_t或uint_least64_t。对于1 << n,如果您的n可能会转到31,您可能会有未定义的行为。请改用UINT64_C(1) << n。
标签: c division integer-division strength-reduction