繁体   English   中英

如何最轻松地预取存储区域?

[英]How can I prefetch a memory region most easily?

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

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

我已经在Windows上看到了GetLogicalProcessorInformation ,但是我对使用如此复杂的API 来做这么简单的事情并不满意,无论如何在Mac或Linux上都无法使用。

也许还有其他一些API / intrinsic可以预取以字节(或字或其他形式)标识的内存区域,并允许我在不知道缓存行长的情况下进行预取?

基本上,是有一个合理的替代_mm_prefetch#define CACHE_LINE_LEN 64

这里有一个问题问的差不多 如果您想研究某些程序集,则可以从CPUID中读取它。 当然,您必须为此编写平台特定的代码。

您可能已经熟悉Agner Fog的优化手册,手册提供了许多流行处理器的缓存信息。 如果您能够确定预期的CPU数量,则可以对缓存行大小进行硬编码,然后查找CPU供应商信息以设置行大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM