c++ - 了解 `_mm_prefetch`

标签 c++ performance intrinsics micro-optimization prefetch

答案What are _mm_prefetch() locality hints?详细说明提示的含义。

我的问题是:我想要哪一个?

我正在处理一个被重复调用数十亿次的函数,其中包含一些 int 参数。我要做的第一件事是使用该参数(它的低 32 位)作为 4GB 缓存的键来查找一些缓存值。根据调用此函数的算法,我知道从一次调用到下一次调用,该 key 通常会加倍(左移 1 位),所以我正在这样做:

int foo(int key) {
  uint8_t value = cache[key];
  _mm_prefetch((const char *)&cache[key * 2], _MM_HINT_T2);
  // ...

目标是在下次调用此函数时将此 保存在处理器缓存中。

我正在寻找对我对两点理解的确认:

  1. _mm_prefetch 的调用不会延迟紧随其后的指令的处理。
  2. 预取错误的位置不会受到惩罚,只是猜测正确会失去好处。

该函数使用 128 个 128 位值(总共 2 KB)的查找表。有没有办法“强制”它被缓存?该查找表的索引按顺序递增;我也应该预取它们吗?我可能应该使用另一个提示来指向另一个级别的缓存?这里最好的策略是什么?

最佳答案

如果您做任何与性能相关的事情,了解您需要什么的最佳和终极方法就是尝试一下。幸运的是,您确切地知道要尝试什么,而且只有几种可能性。

关于你的理解——是的,它是正确的。但是,任何事情都是有代价的(例如,如果您在代码中添加任何指令,处理器将浪费一纳秒的时间来执行它)。您应该通过测量前后的性能来验证您的预取想法。对于非常不规则的访问模式,它很可能会起作用。

关于预取任何顺序数据——你可能不应该打扰。缓存以 64 字节粒度保存数据,因此对于顺序数据,预取通常无济于事。此外,一些(全部?)缓存具有预测加载功能——即使没有被告知,它们也会提前预取。

关于c++ - 了解 `_mm_prefetch`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65604355/

相关文章:

c++ - 绕行:防止通过其他软件杀死我的软件

java - 选择图片后 Android 性能很糟糕

c++ - C++ 中转换为 simd 类型是未定义行为吗?

c - _m_empty 和 _mm_empty 有什么区别?

c++ - AVX2 的 _mm256_cmp_epi32_mask 的模拟

c++ - 我无法在 Boost Spirit 的词法分析器功能中获得语义操作来编译

c++ - 模板特化编译器错误

c++ - Firefox 和 Chrome 中的 NPAPI 支持真的下降了吗?

performance - 在磁盘/流图分区算法上存储非常大的图?

java - 插入USB热点后简单的Java程序慢100倍