Dlaczego mój program jest powolny podczas zapętlania dokładnie 8192 elementów?

Oto fragment tego programu. Macierzimg[][] ma rozmiar SIZE × SIZE i jest inicjowany w:

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

Następnie tworzysz matrycęres[][], a każde pole tutaj jest średnią 9 pól wokół niego w macierzy img. Dla uproszczenia obramowanie jest pozostawione na 0.

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;
}

To wszystko w programie. Ze względu na kompletność, oto co wcześniej. Po tym nie ma kodu. Jak widać, jest to tylko inicjalizacja.

#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;

Zasadniczo ten program jest powolny, gdy SIZE jest wielokrotnością 2048, np. czasy wykonania:

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

Kompilatorem jest GCC. Z tego co wiem, to z powodu zarządzania pamięcią, ale tak naprawdę nie wiem zbyt wiele na ten temat, dlatego pytam tutaj.

Również, jak to naprawić, byłoby miło, ale jeśli ktoś mógłby wyjaśnić te czasy wykonania, byłbym już wystarczająco szczęśliwy.

Wiem już o malloc / free, ale problemem nie jest ilość wykorzystywanej pamięci, to tylko czas wykonania, więc nie wiem, jak by to pomogło.

questionAnswers(2)

yourAnswerToTheQuestion