代码之家  ›  专栏  ›  技术社区  ›  Eamon Nerbonne

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

  •  8
  • Eamon Nerbonne  · 技术社区  · 14 年前

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

    我可以预取 n 缓存线使用 _mm_prefetch 以一种简单的,主要是OS+编译器的可移植方式——但是缓存线的长度是多少?现在,我使用的是64的硬编码值,这似乎是X64处理器的标准值——但我不知道如何在运行时检测到它,以及 a question about this last year found no simple solution .

    我见过 GetLogicalProcessorInformation 在Windows上,但我对使用如此复杂的API进行如此简单的操作持谨慎态度,无论如何,这在Mac或Linux上是行不通的。

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

    基本上,是否有合理的替代方案 MMY-预取 具有 #define CACHE_LINE_LEN 64 ?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Community Mr_and_Mrs_D    7 年前

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

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

    推荐文章