gpt4 book ai didi

c++ - 大数据结构上的缓存行检索和性能

转载 作者:行者123 更新时间:2023-11-28 06:20:41 28 4
gpt4 key购买 nike

假设我有一个非常大的数据结构,它比我的硬件缓存行大得多(请参见下面的示例)。假设我想

  1. 读写位于第一个缓存行的memb_one_
  2. 然后我想读写 memb_forty_ 位于 2 cache line 之后。
  3. 现在我可能还想读取和写入位于第二个缓存行中的成员,即中间行 memb_ten_ 中的成员。这种情况并不总是发生。

所以我需要经常执行第 1 步和第 2 步,但并不总是执行第 3 步。不幸的是我无法更改结构的布局。

我的问题如下:在第 1 步和第 2 步之后,第二个缓存行(即中间的那个)是否从内存中检索到 L1?

据我所知,在 L1 中检索到的缓存行只是读取/写入位于其中的结构成员所“触及”的行。这基本上意味着 L1 中只有结构实例的一部分可用。

如果我的理解是正确的,是否有强制要求所有 3 个缓存行的请求?我想通过在需要时写入第二个缓存行来避免缓存未命中。

如果没有这样的机制,您认为我可以从使用共享相同缓存的后台线程并频繁读取这些实例以保持缓存行“热”中受益吗?此线程永远不会写入以避免虚假共享效应或过多的数据总线流量。

 struct VeryBigStruct 
{
// first cahce line..
int memb_one_;
...

// second cahce line..
int memb_ten_;
...

// third cache line
int memb_forty_;
...
}

我在 Linux 上使用 g++ 4.7 和 4.9

最佳答案

不,在您接触第一条和第三条后,不能保证第二条缓存行在 L1 缓存中。但如果访问频率足够高,它可能就在那里。

如果后台线程与主线程在同一物理内核中运行,它可能只会帮助将数据放入 L1 缓存。您可以为您的线程设置 CPU 亲和性以实现此效果。

在 gcc 中有一个内置函数可以将内存地址预取到缓存中,它是这样称呼的:

__builtin_prefetch(&your_struct_ptr->memb_ten_, 1, 3);

或者你可以这样做:

#include <xmmintrin.h>
...
_mm_prefetch(&your_struct_ptr->memb_ten_, _MM_HINT_ET0);

参见此处:https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html在这里:https://software.intel.com/en-us/node/524263

[我假设您使用 x86 或 x86-64 架构。 ]

关于c++ - 大数据结构上的缓存行检索和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358082/

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