假设我有一个非常大的数据结构,它比我硬件的缓存行(见下面的示例)大得多。让我们假设我想在大数据结构上缓存行检索和性能
- 读写
memb_one_
位于第一高速缓存行 - 然后我想读,写后位于
memb_forty_
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
。
@Alexey:非常感谢!我在想,我晚上把这个调用放在一个现有的线程中(在同一个核心上),它试图通过'try_lock'来获取互斥锁。如果try_lock没有成功,它会调用__builtin_prefetch – 2015-03-31 07:27:51
如果先调用Prefetch,那么Prefetch的效果最好,然后在其他某些东西上花费几个CPU周期,让CPU有时间在后台执行请求,然后再回到真正的使用预取数据。 – 2015-03-31 10:19:15
@Akexet:酷信息!非常感谢! – 2015-03-31 10:45:08