我一直在尝试优化我的C代码中的一个循环,以便更有效地使用缓存。我有几个问题。我不是100%确定我是否正在将代码正确地写入循环块,因为我看到程序的运行时间没有增加速度。这是代码:
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;
}
}
}
我还有另一个问题。如何选择正确的块大小?我知道你想加载足以填充l1缓存。
感谢您的帮助。
答案 0 :(得分:1)
你正在做的事情是毫无意义的,因为我在代码中从0变为N-1,只是稍微复杂一点。所以你从平铺的尝试中获益完全为零。
更重要的是数组y,所以你应该平铺(如果N很大,如果速度不受除法和平方根限制)。对于每个值i,您在数组y中完成一次完整传递。您还可以轻松地为每个j保存一些浮点运算,并且由于r6inv在i和j之间是对称的,因此只需要计算一半的值。