Hier ist der Auszug aus dem betreffenden Programm. Die Matrix img[][]
hat die Größe GRÖSSE × GRÖSSE und wird initialisiert bei:
img[j][i] = 2 * j + i
Dann res[][]
erstellen Sie eine Matrix , und jedes Feld hier ist der Durchschnitt der 9 Felder in der img-Matrix. Der Rand wird der Einfachheit halber bei 0 belassen.
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;
}
Das ist alles, was das Programm zu bieten hat. Der Vollständigkeit halber ist hier das, was vorher kommt. Es kommt kein Code mehr. Wie Sie sehen können, handelt es sich nur um eine Initialisierung.
#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;
Grundsätzlich ist dieses Programm langsam, wenn SIZE ein Vielfaches von 2048 ist, z. B. die Ausführungszeiten:
SIZE = 8191: 3.44 secs
SIZE = 8192: 7.20 secs
SIZE = 8193: 3.18 secs
Der Compiler ist GCC. Soweit ich weiß, liegt dies an der Speicherverwaltung, aber ich weiß nicht wirklich viel über dieses Thema, weshalb ich hier frage.
Auch wie man das behebt, wäre schön, aber wenn jemand diese Ausführungszeiten erklären könnte, wäre ich schon glücklich genug.
Ich kenne malloc / free bereits, aber das Problem ist nicht die Menge des verwendeten Speichers, sondern lediglich die Ausführungszeit. Ich weiß also nicht, wie das helfen würde.