これはcachegrind出力の一部です。コードのこの部分は1224回実行されました。elmg1は、サイズ16 x 20のunsignedlongの配列です。私のマシンのL1キャッシュサイズは32KB、64Bキャッシュラインサイズ、8ウェイセットアソシアティブです。
- for(i = 0; i <20; i ++)78,336 2,448 2 50,184 0 0 1,224 0 0
- {{
- telm01 = elmg1 [i]; 146,880 0 0 73,440 0 0 24,480 0 0
- telm31 =(telm01 << 3)^ val1; 97,920 0 0 48,960 0 0 24,480 0 0
- telm21 =(telm01 << 2)^(val1 >> 1); 146,880 1,224 1 48,960 0 0 24,480 0 0
- telm11 =(telm01 << 1)^(val1 >> 2); 146,880 0 0 48,960 0 0 24,480 0 0
- }
A.ここに記載した理由は、forループ内の3行目に、I1ミスが多数見られるためです(L2ミスも1つ)。やや紛らわしく、理由がわかりませんでしたか?
B.コードの一部を最適化(時間)しようとしています。上記はほんの小さなスニペットです。私のプログラムのメモリアクセスでは、多くの費用がかかると思います。上記の例のように、elmg1は16x20サイズのunsignedlongの配列です。私がコードでそれを使おうとすると、常にいくつかのミスがあり、私のプログラムではこれらの変数が頻繁に発生します。助言がありますか?
C.これらの署名されていないlongを割り当てて(場合によっては初期化する)必要があります。calloc宣言と配列宣言のどちらを優先するかを提案してから、明示的に初期化してください。ちなみに、キャッシュがそれらを処理する方法に違いはありますか?
ありがとう。