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

Eam*_*nne 8 c++ 64-bit caching

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

我可以使用简单的,主要是OS +编译器 - 便携式方式预取n个缓存行_mm_prefetch- 但是缓存行的长度是多少?现在,我正在使用64的硬编码值,这在x64处理器上似乎是现在的常态 - 但我不知道如何在运行时检测到这一点,并且去年的一个问题没有找到简单的解决方案.

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

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

基本上,有没有一个合理的选择_mm_prefetch#define CACHE_LINE_LEN 64

Ron*_*lic 4

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

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