Por que meu programa fica lento ao fazer o loop de exatamente 8192 elementos?

Aqui está o extrato do programa em questão. O Matriximg[][] tem o tamanho SIZE × SIZE e é inicializado em:

img[j][i] = 2 * j + i

Então você faz uma matrizres[][], e cada campo aqui é feito para ser a média dos 9 campos ao redor dele na matriz img. A borda é deixada em 0 para simplificar.

for(i=1;i<SIZE-1;i++) 
    for(j=1;j<SIZE-1;j++) {
        res[j][i]=0;
        for(k=-1;k<2;k++) 
            for(l=-1;l<2;l++) 
                res[j][i] += img[j+l][i+k];
        res[j][i] /= 9;
}

Isso é tudo que existe para o programa. Por completo, aqui está o que vem antes. Nenhum código vem depois. Como você pode ver, é apenas inicialização.

#define SIZE 8192
float img[SIZE][SIZE]; // input image
float res[SIZE][SIZE]; //result of mean filter
int i,j,k,l;
for(i=0;i<SIZE;i++) 
    for(j=0;j<SIZE;j++) 
        img[j][i] = (2*j+i)%8196;

Basicamente, este programa é lento quando SIZE é um múltiplo de 2048, por ex. os tempos de execução:

SIZE = 8191: 3.44 secs
SIZE = 8192: 7.20 secs
SIZE = 8193: 3.18 secs

O compilador é o GCC. Pelo que eu sei, isso é por causa do gerenciamento de memória, mas eu realmente não sei muito sobre esse assunto, e é por isso que estou perguntando aqui.

Também como consertar isso seria legal, mas se alguém pudesse explicar esses tempos de execução eu já estaria feliz o suficiente.

Eu já sei de malloc / free, mas o problema não é a quantidade de memória usada, é apenas tempo de execução, então eu não sei como isso ajudaria.

questionAnswers(2)

yourAnswerToTheQuestion