我目前正在研究是否有可能加快货车Emde Boas(或任何树)树遍历的速度。给定一个搜索查询作为输入,该高速缓存行中已经有多个树节点(van Emde Boas布局),树遍历似乎是指令瓶颈。
作为SIMD/AVX/SSE指令的新手,我想从该领域的Maven那里了解一下,是否有可能同时将多个节点与一个值进行比较,然后找出下一步要遵循的树路径。我的研究引出了以下问题:
多少CPU周期/指令被浪费在SIMD/AVX/SSE寄存器等的构造上。如果构造比手动遍历整个子树花费更多的时间(大小为64字节的1个高速缓存行中的2+4+8个节点),则这将使其成为一种韦恩。
有多少CPU周期/指令被浪费在寻找正确的SIMD/AVX/SSE寄存器上,寄存器保存着要遵循哪条路径的答案?有没有人能想出一个聪明的方法,让那些 findMinimumInteger AVX指令可以在1(??)个CPU周期内决定这一点?
你猜呢?
另一种更复杂的加速树遍历的方法是一次运行多个搜索查询,当有很高的概率落在最后一个树层中紧密相连的节点上时。对此有什么猜测吗?如果它必须把那些不再属于同一个子树的查询放在一边,然后在完成树的第一次“并行遍历”后递归地找到它们。树查询具有连续的访问模式,但不是恒定的访问模式(query[i]
总是〈query[i+1]
)。
重要:这是关于整数树的,这就是为什么使用货车Emde Boas树的原因(也许稍后会尝试x-快/y-快)
我很好奇你在这个问题上的50美分是多少,因为你可能会对大规模树的最高可实现性能感兴趣。提前感谢你花时间在这个问题上:-)
2条答案
按热度按时间lp0sw83n1#
我已经使用SSE 2/AVX 2来帮助执行B+树搜索。下面的代码在AVX 2中对16个DWORD的完整缓存行执行“二进制搜索”:
每个
bnode
最终会有一个高度可预测的分支,以测试是否已经到达树的末尾。这应该可以轻松扩展到AVX-512。
要预处理并去除慢的
PERMD
指令,可以使用以下语句:tuwxkamq2#
根据您的代码,我已经对3个选项进行了基准测试:AVX 2支持的嵌套分支(4次跳转)和无分支变体。结果如下:
所以我的结论看起来像:当内存访问是最佳的,AVX可以帮助树的大于200 k的元素。低于这几乎没有任何惩罚支付(如果你不使用AVX的任何其他事情)。这是值得的晚上基准测试。感谢大家参与:-)