背景:我实现了一种随机算法,该算法需要随机排序以获得最佳收敛。然而,这样做显然会破坏内存局部性。我发现通过预取下一次迭代的数据,可以最大限度地减少性能下降。
我可以使用 _mm_prefetch
预取 n 缓存行,主要是操作系统+编译器可移植的简单方式 - 但缓存行的长度是多少?现在,我使用的是硬编码值 64,这似乎是当今 x64 处理器上的标准 - 但我不知道如何在运行时检测到它,并且 a question about this last year found no simple solution .
我看过 GetLogicalProcessorInformation在 Windows 上,但我对将如此复杂的 API 用于如此简单的事情持谨慎态度,无论如何这在 Mac 或 Linux 上都不起作用。
也许有一些完全不同的 API/内部函数可以预取以字节(或字,或其他)标识的内存区域,并允许我在不知道缓存行长度的情况下进行预取?
基本上,是否有使用 #define CACHE_LINE_LEN 64
的 _mm_prefetch
的合理替代方案?
最佳答案
有一个问题问的是同样的事情 here .如果您想深入研究某个程序集,可以从 CPUID 中读取它。当然,您必须为此编写特定于平台的代码。
您可能已经熟悉 Agner Fog 的 manuals for optimization它提供了许多流行处理器的缓存信息。如果您能够确定您将遇到的预期 CPU,您只需硬编码缓存行大小并查找 CPU 供应商信息以设置行大小。
关于c++ - 如何最轻松地预取内存区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3979700/