假设我们想从数组中获取一个值。
在某些情况下,我们知道数据位于 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/