c++ - 如何在 C++ 中获取内存位置而不等待其检索?

标签 c++ caching optimization compiler-optimization latency

假设我们想从数组中获取一个值。

在某些情况下,我们知道数据位于 data[i] 中。

在其他情况下,我们需要将索引移动一些偏移量:i += offset[i]

i = ....

FETCH data[i];         // The result could be here if the offset_shifts is 0 
                       // Or if i is very small (data[i] is in the same cache line & page)

i += offset_shifts[i];     // LLC cache miss (and most probably a TLB miss)

result = data[i];       // LLC cache miss (and most probably a TLB miss), 
                        // unless it is obtained by an earlier FETCH

我期望从这个技巧中得到的好处是,如果 offset_shifts[i] 很小,那么这意味着不会有 TLB 和 LLC 缓存未命中,因此可以通过以下方式完成这些查找一次内存查找(而不是两次)的开销

如何在从内存中获取offset_shifts[i]的同时获取data[i]的值?换句话说,在 C++ 中实现这种“非阻塞获取”的正确方法是什么?

最佳答案

在可移植的 C++ 中,我将按如下方式解决它:

result = data[i]; // Unconditional!
auto offset = offset_shifts[i];
if (offset)
   result = data[i+offset];

基本原理是 result 可能只是一个寄存器,因此 result = data[i]; 实际上只是一个读取。这将开始读取,但不会阻塞 CPU 管道以进行下一个操作。 offset_shifts[i] 与之前的操作并行有效地检索。 (优化器甚至可能交换这两个操作 - 它比我更了解 CPU)。如果采用分支,您将获得预期的缓存效果。如果不采取,该操作将尽可能有效。

关于c++ - 如何在 C++ 中获取内存位置而不等待其检索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62511795/

相关文章:

javascript - 即使使用 math random,IE8 仍在缓存我的请求

caching - 如果 Cache-Control 有 `no-cache` 和 `max-age=900` 会发生什么?

vba - 将工作表 1 第 1 列与工作表 2 第 1 列比较工作表 1 第 6 列中的位置值

python - 在 Python 中高效检查数百万个图像 URL

c++ - C/C++ 中的参数传递技术

c++ - 如何在 C++ 中创建任意函数的字符串参数化包装器?

caching - .Net Core 中的 CacheDependency 类,用于建立缓存和文件的依赖关系

c++ - 为什么没有将 yield 添加到 C++0x 中?

c++ - 如何使用插槽实时更新 paint()

c# - 查找两个列表中的差异