【问题标题】:Loop Tiling Optimisations循环平铺优化
【发布时间】:2016-03-14 14:58:09
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

    标签: c loops optimization


    【解决方案1】:

    您所做的事情毫无意义,因为 i 在您的代码中从 0 变为 N-1,只是以稍微复杂的方式。因此,您从平铺尝试中受益完全为零。

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

    【讨论】:

    • 我将如何实现这部分,'您还可以轻松地为每个 j 保存一些浮点运算',所以我应该将平铺交换到内部循环而不是外部循环?
    猜你喜欢
    • 2019-10-15
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多