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.