gpt4 book ai didi

c - 循环平铺优化

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

我一直在尝试优化 C 代码中的一个循环,以使其更有效地使用缓存。我有几个问题。我不能 100% 确定我是否正确地将代码写入循环 block ,因为我发现程序运行时间的速度没有增加。这是代码:

for(int k = 0; k < N; k+=b){
for (int i = k; i<MIN(N,i+b); ++i) {
a1[i] = 0.0f;
a2[i] = 0.0f;
for (int j = 0; j < N; j++) {
x = x[j] - x[i];
y = y[j] - y[i];
2 = x*x + y*y + eps;
r2inv = 1.0f / sqrt(r2);
r6inv = r2inv * r2inv * r2inv;
s = m[j] * r6inv;
ax[i] += s * x;
ay[i] += s * y;
}
}
}

我还有另一个问题。如何选择正确的 block 大小?我知道您希望加载足够的内容来填充一级缓存。

感谢您提前提供的帮助。

最佳答案

你所做的事情是毫无意义的,因为 i 在你的代码中从 0 到 N-1,只是以一种稍微复杂的方式。因此,您从平铺尝试中获得的 yield 恰好为零。

更关键的是数组 y,所以这就是您应该平铺的内容(如果 N 很大,并且速度不受除法和平方根的限制)。对于每个值 i,您都会完整地遍历数组 y。您还可以轻松地为每个 j 节省一些浮点运算,并且由于 r6inv 在 i 和 j 之间是对称的,因此只需要计算一半的值。

关于c - 循环平铺优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35990931/

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