Por que a ordem dos loops em um algoritmo de multiplicação de matrizes afeta o desempenho? [duplicado

Esta pergunta já tem uma resposta aqui:

or que a ordem dos loops afeta o desempenho ao iterar em uma matriz 2 respostas

Recebo duas funções para encontrar o produto de duas matrizes:

 void MultiplyMatrices_1(int **a, int **b, int **c, int n){
      for (int i = 0; i < n; i++)
          for (int j = 0; j < n; j++)
              for (int k = 0; k < n; k++)
                  c[i][j] = c[i][j] + a[i][k]*b[k][j];
  }

 void MultiplyMatrices_2(int **a, int **b, int **c, int n){
      for (int i = 0; i < n; i++)
          for (int k = 0; k < n; k++)
              for (int j = 0; j < n; j++)
                  c[i][j] = c[i][j] + a[i][k]*b[k][j];
 }

Eu corri e criei o perfil de dois executáveis usandogprof, cada um com código idêntico, exceto para esta função. O segundo deles é significativamente (cerca de 5 vezes) mais rápido para matrizes de tamanho 2048 x 2048. Alguma idéia do porquê?

questionAnswers(4)

yourAnswerToTheQuestion