вложенный для оптимизации цикла - PullRequest
2 голосов
/ 25 декабря 2011

Это исходный код

for (j = 0; j <= 30; j++) {
  for (k = 0; k <= 30; k++) {
    x[j][k] = y[j][k] + z[j][k];
  }
}

И приведенный ниже код приведен после применения оптимизации исключения общего подвыражения

for (j = 0; j <= 30; j++) {
  for (k = 0; k <= 30; k++) {
    t2 = C1 * j + W * k;
    x[t2] = y[t2] + z[t2];
  }
}

Как удаление общего выражения помогаетулучшить производительность в этом случае?Это единственный оптимизированный индекс индексов?

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Любой полуприличный современный компилятор уже будет выполнять эту оптимизацию.

Кроме того, часть вычисления индекса должна быть выведена во внешний цикл:

for (j = 0; j <= 30; j++) {
  t1 = C1 * j;
  for (k = 0; k <= 30; k++) {
    t2 = t1 + W * k;
    x[t2] = y[t2] + z[t2];
  }
}
2 голосов
/ 25 декабря 2011

Это помогает, потому что выполнение двумерного индекса выполняет неявное умножение и сложение КАЖДОЕ ВРЕМЯ, которое вы делаете [j][k].Во втором вы выполняете только арифметику ONCE (для каждой итерации цикла) и сохраняете то, что по существу [j][k] в t2, и просто повторно используете t2 вместо неявного выполнения [j][k] арифметики три раза в исходном коде.

Конечно, компиляторы, как правило, достаточно умны, чтобы знать лучше, но я предположил, что вы просто просили теорию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...