【发布时间】:2017-07-29 14:41:01
【问题描述】:
我正在尝试使用整数算术运算来计算 log2(x)。
输入 x 是一个介于 1 和 2 之间的值。
因为这只会产生 0,所以一切都预先缩放 16。
换句话说:
- 该函数采用整数值
x * 2^16而不是x - 函数返回
log2(x) * 2^16的整数值而不是log2(x)
这是我的代码:
uint64_t Log2(uint64_t x)
{
static uint64_t TWO = (uint64_t)2 << 16;
uint64_t res = 0;
for (int i=0; i<16; i++)
{
x = (x * x) >> 16;
if (x >= TWO)
{
x >>= 1;
res += 1 << (15 - i);
}
}
return res;
}
我正在寻找的是一种提高循环性能的方法。
【问题讨论】:
-
让循环向后运行?那么就不需要
31 - i了。 -
你的帖子更适合Code Review。
-
因此是一个深度流水线、无序架构,具有快速、完全流水线的乘法。然后,我建议用无分支代码替换
if。我也会仔细研究尝试减少依赖链的长度,但这可能对这个算法来说很难——每次迭代都依赖于上一次迭代中x的值,极大地限制了 OoOE 引擎利用指令级并行性。 -
@Olaf:你真的认为,在优化方面,AVR、x86 和 GPU 完全一样吗?
-
功能代码的审查与 Stack Overflow 无关。此类问题属于Code Review。
标签: c++ c logarithm fixed-point