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

10-11 06:08