c++ - 如何最轻松地预取内存区域?

标签 c++ caching 64-bit

背景:我实现了一种随机算法,该算法需要随机排序以获得最佳收敛。然而,这样做显然会破坏内存局部性。我发现通过预取下一次迭代的数据,可以最大限度地减少性能下降。

我可以使用 _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/

相关文章:

javascript - 在 JavaScript 中从高位和低位 32 位部分创建 64 位整数时,如何防止值太大?

c++ - 将静态 (.a) 库与共享 (.so) 库链接,出现错误 "relocation R_X86_64_32S against a local symbol; recompile with -fPIC"

c++ - 直接访问硬盘?

c++ - 一元运算符具有关联性是否有意义?

objective-c - UIImage 是否缓存图像?

java - Tomcat 缓存 XHR 响应

C++ 线程与可见性问题——常见的工程实践是什么?

c++ - 如何确定存储在数组中的项目数?

php - Yii 中的模式缓存

linux - ubuntu 中的单声道和非托管代码