循环平铺优化

时间:2016-03-14 14:58:09

标签: c loops optimization

我一直在尝试优化我的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缓存。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你正在做的事情是毫无意义的,因为我在代码中从0变为N-1,只是稍微复杂一点。所以你从平铺的尝试中获益完全为零。

更重要的是数组y,所以你应该平铺(如果N很大,如果速度不受除法和平方根限制)。对于每个值i,您在数组y中完成一次完整传递。您还可以轻松地为每个j保存一些浮点运算,并且由于r6inv在i和j之间是对称的,因此只需要计算一半的值。