Производительность этой структуры цикла будет ужасной. Рассмотрим самый внутренний цикл:
for(m = 0; m < 3; m++) {
block[m][k] == grid[j + m][i + k];
}
C упорядочен по "строке-мажору", что означает, что доступ к block
вызовет пропадание кэша на каждой итерации! Это потому, что к памяти не осуществляется непрерывный доступ.
Есть похожая проблема для grid
. Ваш порядок вложенных циклов должен исправить i
до изменения j
, но вы получаете доступ к grid
на j
в качестве строки. Это снова не является непрерывным и будет кэшировать промах на каждой итерации.
Таким образом, практическое правило при работе с вложенными циклами и многомерными массивами заключается в размещении индексов цикла и индексов массива в одном и том же порядке. Для вашего кода это
for(j = 0; j < 9; j += 3) {
for(m = 0; m < 3; m++) {
for(i = 0; i < 9; i += 3) {
for(k = 0; k < 3; k++) {
block[m][k] == grid[j + m][i + k];
}
}
// make sure you access everything so that order doesn't change
// your program's semantics
}
}