高速缓存行检索和在大型数据结构上的性能
cache line retrieval and performance on large data structure
假设我有一个非常大的数据结构,它比硬件的缓存线大得多(请参阅下面的示例)。让我们假设我想
- 读取和写入位于第一高速缓存行的CCD_ 1
- 那么我想读取和写入位于2个缓存行之后的CCD_ 2
- 现在我可能还想要读取和写入位于第二高速缓存行中的成员,即中间行
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 and 4.9
。
否,触摸第一个和第三个缓存线后,第二个缓存线不保证在一级缓存中。但是,如果访问频率足够高,它可能就在那里。
如果后台线程与主线程在同一物理核心中运行,那么它可能只会帮助将数据放入一级缓存。您可以为线程设置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++:使用缓冲区中的数据填充结构
- c ++数据输入并读回列表中的结构结构中的数组
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- 结构成员上的模板函数
- UE4 数据表结构错误
- C++14 结构体上的统一初始化
- 指针帮助:取消指向访问其内部数据的结构的指针
- 如何创建一个函数以读/写数据给结构成员
- TCP-Server以数据包结构(非Java客户端)发送文件
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- C# TCP 数据包结构
- 分割错误 (SIGSEGV) 获取数据作为结构向量中的输入时
- 用于存储数据的结构和外部二进制文件
- C++:我想将数据从结构复制/存储到单独的数组中
- 静态数据类型(结构)的组织
- 从 std::vector<无符号字符中的数据填充结构>
- 将来自 QByteArray 的数据放在结构中
- 编译器在转发结构声明上出错
- 用于在移动设备上存储来自数千个文件的数据的结构
- 如何发送一个结构作为数据在UDP上使用SendBuffer