Aqui está o extrato do programa em questão. A matriz img[][]
tem o tamanho SIZE × SIZE e é inicializada em:
img[j][i] = 2 * j + i
Então, você cria uma matriz res[][]
, e cada campo aqui é criado para ser a média dos 9 campos ao seu redor 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 o que há no programa. Por uma questão de completude, eis 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 é múltiplo de 2048, por exemplo, 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 sei, isso se deve ao gerenciamento de memória, mas não sei muito sobre esse assunto, e é por isso que estou perguntando aqui.
Também como corrigir isso seria bom, mas se alguém pudesse explicar esses tempos de execução, eu já ficaria feliz o suficiente.
Eu já conheço o malloc / free, mas o problema não é a quantidade de memória usada, é apenas o tempo de execução, então não sei como isso ajudaria.