gpt4 book ai didi

c++ - 如何在不等待检索的情况下获取 C++ 中的内存位置?

转载 作者:行者123 更新时间:2023-12-01 14:47:29 25 4
gpt4 key购买 nike

假设我们想从数组中获取一个值。
在某些情况下,我们知道数据在 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 缓存未命中,因此可以使用一次内存查找(而不是两次)的开销来完成这些查找
如何获取 data[i] 的值 同时那个 offset_shifts[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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com