問題のプログラムからの抜粋です。行列img[][]
のサイズは SIZE×SIZE で、次の場所で初期化されます。
img[j][i] = 2 * j + i
次に、行列を作成しres[][]
ます。ここの各フィールドは、img 行列の周囲の 9 つのフィールドの平均になります。簡単にするために、境界線は 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 については既に知っていますが、問題はメモリの使用量ではなく、単に実行時間であるため、それがどのように役立つかわかりません。