【发布时间】:2015-11-26 11:49:45
【问题描述】:
出于教育目的,我正在尝试使用 CPU 缓存线击败 binary search。
https://github.com/nmmmnu/beating_binsearch/blob/master/improved.h
如果您取消注释 #define EXIT_ONLY,搜索将像正常的 binary search 一样工作,除非元素很少,搜索变为 linear search。
正如预期的那样,这比binary search 执行更快。
但是我想改进未来,所以如果您评论 #define EXIT_ONLY,那么“小”linear search 将被创建,而不是仅访问“中间”元素。
理论上,线性搜索的值必须在 CPU 缓存行中,并且访问必须是“免费的”。
但实际上,这种搜索比普通的binary search 慢得多。
如果我将CACHE_COUNT_2 硬编码为等于 1,则速度相当,但仍然较慢。
请注意,我从未尝试在 _linear() 中展开 for 循环。
执行速度较慢的原因是什么?
所有文件的回购都在这里:
https://github.com/nmmmnu/beating_binsearch
【问题讨论】:
-
我想你可能会在codereview.stackexchange.com得到更好的答案
-
@user2079303 你可以,但这个问题必须首先完全重新完成。 CodeReview 上的问题需要 a) 已经按预期工作,并且 b) 问题中嵌入了代码。此外,功能请求和代码解释也是题外话。
-
如果您只包含指向您的存储库的链接而不是在您的问题中内联相关摘录,我认为您不会得到很多答案。
-
我想我不明白在中间添加小搜索应该如何提高速度的想法。在中间做一个小的线性搜索有什么意义?当您接近目标时这是有道理的,但在所有其他情况下,花费几乎免费的周期是毫无意义的。假设第一个比较告诉您需要走到中间的左侧。在中间右侧进行线性搜索有什么意义?
-
我希望预取器能够理解二进制搜索并主要消除缓存未命中。二进制搜索并不像看起来那样对缓存不友好。
标签: c++ performance c++11 binary-search cpu-cache