如何最容易预取内存区域?

时间:2010-10-20 15:44:57

标签: c++ caching 64-bit

背景:我已经实现了一种随机算法,需要随机排序以获得最佳收敛。但是,这样做显然会破坏内存局部性。我发现通过预取下一个迭代的数据,性能下降最小化。

我可以使用_mm_prefetch以简单的OS +编译器兼容方式预取 n 缓存行 - 但是缓存行的长度是多少?现在,我使用64的硬编码值,这在x64处理器上似乎是现在的常态 - 但我不知道如何在运行时检测到这一点,a question about this last year found no simple solution

我在Windows上看过GetLogicalProcessorInformation,但我对于使用如此简单的复杂API非常谨慎,而且无论如何都无法在mac或linux上运行。

也许还有一些其他的API /内在函数可以预取一个用字节(或单词等)标识的内存区域,并允许我在不知道缓存行长度的情况下进行预取?

基本上,_mm_prefetch#define CACHE_LINE_LEN 64是否有合理的替代方法?

1 个答案:

答案 0 :(得分:5)

有一个问题询问同样的事情here。如果您想深入研究某些程序集,可以从CPUID中读取它。当然,您必须为此编写特定于平台的代码。

你可能已经熟悉了Agner Fog的manuals for optimization,它为许多流行的处理器提供了缓存信息。如果您能够确定所遇到的预期CPU,则可以对高速缓存行大小进行硬编码,并查找CPU供应商信息以设置行大小。