gpt4 book ai didi

c - 如何管理硬件缓存使用

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:35 24 4
gpt4 key购买 nike

我想知道是否有一种方法可以直接管理内存的哪些部分被加载到(并保存在)缓存中。我知道 gcc 中有 __builtin_prefetch(),但我需要更多(至少我认为我会......)。

这是我的问题:我有一个更新 vector v 的循环(非常 伪代码):

while (1) {
update_an_entry_in_v;
}

v 的长度以百万为单位。循环跑了几百上百万次,在v里面跳来跳去。所以我的缓存命中率真的很差,没办法把v全部放到L1缓存里。

我可以这样重组代码:

for (i=0; i < length_of_v; i+=1024) {
while (1) {
update_an_entry_in_v[i:i+1023];
}
}

也就是说,首先只处理那些我知道只会更新 v[0:1023] 中的条目的更新,处理所有这些,然后转到下一个 block ,等等。

现在这可能会有更好的缓存行为,但我想知道是否有可能让它变得更好。让我们关注 v[0:1023] block 。我仍然会在 v[0:1023] 内跳来跳去,所以硬件可能认为没有必要再将那 block 内存的一部分保留在 L1 缓存中,然后,砰!,我又回到了那个 block .

所以问题就变成了:有没有办法标记整个 v[0:1023],以便它在内部 while 循环之前加载到 L1,然后在 while 循环完成后“取消标记”它?

(显然,1024 只是一个应该调整的方便数字。8K 内存加倍,鉴于现在大多数机器至少有 32-64K L1 数据缓存,应该为其他所有内容留出足够的空间。)

最佳答案

显然我不知道你在做什么,这在某种程度上回避了这个问题,但如果你知道索引,你可以对索引进行基数排序,然后按顺序遍历整个事情,这将提高缓存效率吗?也许他们更新的顺序很重要,但从我猜到的关于重组代码的评论来看,如果没有,我会提到它。 [好吧,由于基数排序是稳定的,因此在某种程度上保留了顺序,但只有当它是相同的索引时]。

关于c - 如何管理硬件缓存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34248015/

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