gpt4 book ai didi

c++ - 缓存友好代码示例

转载 作者:行者123 更新时间:2023-11-28 00:25:24 30 4
gpt4 key购买 nike

template<size_t size>
class Objects{
std::array<int,size> a;
std::array<int,size> b;
std::array<int,size> c;

void update(){
for (size_t i = 0; i < size; ++i){
c[i] = a[i] + b[i];
}
}
};

一周以来,我一直在收集有关如何编写缓存友好代码的信息,并且阅读了几篇文章,但我仍然不了解基础知识。

大多数示例中都使用了我上面编写的代码,但对我来说,这根本不是缓存友好的。

对我来说内存布局应该是这样的

aaaabbbbcccc

在第一个循环中它将访问

[a]aaa[b]bbb[c]ccc

如果我理解正确的话,cpu 会预取内存中附近的元素。我不确定这个方法有多智能,但我认为它是原始的,它只获取第 n 个最近的元素。

问题是 [a]aaa[b]bbb[c]ccc 根本不会按顺序访问元素。所以它可能会获取下一个“3”个元素a[aaa]bbbbcccc,这对下一个 a 很好,因为它将是缓存命中但对 b 不是。

上面的例子是缓存友好代码吗?

最佳答案

我建议你使用结构数组:

struct Cache_Item
{
int a;
int b;
int c;
};

Cache_Item cache_line[size];

for (unsigned int i = 0; i < size; ++i)
{
cache_line[i].c = cache_line[i].a + cache_line[i].b;
}

结构安排允许所有使用的变量在缓存行中彼此相邻或非常接近。

在您的数组方法中,元素 b[0] 理想情况下位于位置 a[size],因此它们相距 size 个项目。这可能意味着它们位于不同的高速缓存行上。结果位置 c[0] 位于 a[size + size],这意味着它可能距离 2 个缓存行。

关于c++ - 缓存友好代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333154/

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