Запуск perf stat -ddd
во время игры с предоставленной программой показывает, что основное различие между двумя версиями заключается в основном в предварительной выборке.
part II -> part I and part I -> part II (original program)
73,069,502 L1-dcache-prefetch-misses
part II -> part I and part II -> part I (only the efficient version)
31,719,117 L1-dcache-prefetch-misses
part I -> part II and part I -> part II (only the less efficient version)
114,520,949 L1-dcache-prefetch-misses
nb: согласно проводнику компилятора, part II -> part I
- этоочень похоже на part I -> part II
.
Полагаю, что на первых итерациях с i
part II
почти ничего не делает, но итерации с j
делают part I
доступ U[k][j]
в соответствии сшаблон, который облегчит предварительную выборку для следующих итераций по i
.