我一直在尝试优化我的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变为N-1,只是方式稍微复杂一些。因此,您从平铺尝试中获得的收益完全为零。
更为关键的是数组y,因此应该进行平铺(如果N大,并且速度不受除数和平方根的限制)。对于每个值i,您都要对数组y进行一次完整遍历。您还可以轻松地为每个j保存一些浮点运算,并且由于r6inv在i和j之间是对称的,因此仅需要计算一半的值。
关于c - 循环平铺优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35990931/