Вот выдержка из рассматриваемой программы. Матрица img[][]
имеет размер SIZE × SIZE и инициализируется по адресу:
img[j][i] = 2 * j + i
Затем вы создаете матрицу res[][]
, и каждое поле здесь составляет среднее из 9 полей вокруг него в матрице img. Для простоты граница оставлена на 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;
}
Что там все в программе. Для полноты, вот что было раньше. После этого код не появляется. Как вы можете видеть, это просто инициализация.
#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;
В основном, эта программа медленна, когда SIZE кратно 2048, например. время выполнения:
SIZE = 8191: 3.44 secs
SIZE = 8192: 7.20 secs
SIZE = 8193: 3.18 secs
Компилятор - это GCC. Из того, что я знаю, это из-за управления памятью, но я действительно не знаю слишком много об этом предмете, поэтому я спрашиваю здесь.
Также, как исправить это было бы хорошо, но если бы кто-то мог объяснить эти времена выполнения, я уже был бы достаточно счастлив.
Я уже знаю malloc/free, но проблема заключается не в количестве используемой памяти, а просто в времени выполнения, поэтому я не знаю, как это могло бы помочь.