【发布时间】:2014-01-04 01:55:32
【问题描述】:
对于利用缓存行预取的树布局(reading _next_ cacheline 很便宜),我需要以非常快速的方式解决地址计算。我能够将问题归结为:
newIndex = nowIndex + 1 + (localChildIndex*X)
x 例如:X = 45 + 44 + 43 + 42 +40.
注意:4 是分支因子。实际上它将是 16,所以是 2 的幂。这应该对使用按位的东西有用吗?
如果它需要一个循环来计算 X (performancewise) 和除法/乘法之类的东西,那就太糟糕了。这是一个有趣的问题,我无法想出一些好的计算方法。
由于它是树遍历的一部分,因此可以使用 2 种模式:绝对计算,独立于先前的计算和增量计算,从将高 X 保存在变量中开始,然后在每个更深层次对其进行一些最小的操作树。
我希望我能够弄清楚数学应该做什么。不确定是否有办法快速且无循环地做到这一点 - 但也许有人可以提出一个非常聪明的解决方案。我要感谢大家的帮助 - StackOverflow 过去一直是我的好老师,我希望随着我知识的增长,将来能够回馈更多。
【问题讨论】:
-
澄清一下:
^是幂还是异或? -
身份:
X^n + X^(n-1) + ... + X^1 + X^0 = {X^(n + 1) - 1} / {X - 1} -
也是
x变量吗?否则这将是微不足道的。 -
@Nabla - 好点。如果
x是固定的,只需计算一次并存储即可。 -
它的力量。对不起,应该澄清一下。是的,x 是固定的,因为它取决于分支因子(通常为 16)。我也在考虑一个查找表。不过不确定。
标签: c math optimization assembly hpc