gpt4 book ai didi

swift - 添加到整数数组的缓存友好方式

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

我变得更加注意优化缓存代码。我很好奇以下哪一种是添加两个数组的更缓存友好的方法。代码是 swift 的。

struct A {
var x, y, z: [Int]
}
func add1(a: inout [A]) {
for i in 0 ..< a.count {
a[i].z = a[i].x + a[i].y
}
}
func add2(x: [Int], y:[Int], z: inout [Int]) {
for i in 0 ..< x.count {
z[i] = x[i] + y[i]
}
}

我担心的是,在add2中,局部性的好处可能会因为xyz而减弱内存中不必彼此靠近。例如,假设x[0]加载到缓存中,然后y[0]加载到缓存中。 y[0] 附近的数据是否会覆盖缓存中 x[0] 附近的数据,从而需要从 ram 中重新读取来加载 x[1 ]?如果是的话,add1 可以解决这个问题吗?

最佳答案

add2这样的访问模式在具有直接映射缓存的处理器上可能会出现问题,而且只有当数组的地址完全错误时才会出现问题。对于典型的 4 路或 8 路组关联缓存,即使数组地址非常不幸,这里也不存在真正的问题:如果 block 包含 x[0]y[0 ]z[0] 都映射到同一组,它们仍然会适合并且不会互相弹出。直接映射缓存确实会遇到您担心的冲突未命中问题,这也是它们现在很少见的部分原因,但还有更多原因。

实际上,像 add2 这样的访问模式非常好,因为根据正在执行的操作,它也可以自动矢量化。这不是通过溢出检查加法来完成的(检查加法很难矢量化),而是通过包装加法 &+ compiler can use 来完成。 movdqu 用于同时加载和存储两个 Int,paddq 用于同时添加两个 Int。

关于swift - 添加到整数数组的缓存友好方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51436114/

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