Текущий l oop:
#define N 3000
...
int i, j;
int a[N][N], b[N][N], c[N];
// Fill in b and c with random values
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
a[i][j] = b[i][j] / c[i];
}
}
Моя оптимизированная версия развертывает как внешнюю, так и внутреннюю l oop:
for (int i = 0; i < N; i += 2) {
for (int j = 0; j < N; j += 2) {
a[i][j] = b[i][j] / c[i];
a[i][j + 1] = b[i][j + 1] / c[i];
a[i + 1][j] = b[i + 1][j] / c[i + 1];
a[i + 1][j + 1] = b[i + 1][j + 1] / c[i + 1];
}
}
Однако мой инструктор сказал, что второй l oop не очень хорошо оптимизирован. Указание на c (i) должно быть взято из l oop над j. L oop оптимизируется путем изменения порядка индексов. Таким образом, вы совершаете один проход по внутренней памяти l oop вместо зигзагообразных поисков.
Я до сих пор не уверен, что он имеет в виду, так как изменение порядка индексов все равно сделает l oop траверс по зигзагообразному типу. Каким должно быть правильное решение для этого случая?