キャッシュされた動作:例れい


CPUのキャッシュはハードウェアレベルで制御される.したがって、プログラマは直接制御できません.しかし、間接的な制御方法もある.まず、次のコードを見てみましょう.
int arr[MAX][MAX];

for(int i = 0; i < MAX; i++)
	for(int k = 0; k < max; k++)
    	std::cout<<arr[i][k];
        
for(int k = 0; k < MAX; k++)
	for(int i = 0; i < max; i++)
    	std::cout<<arr[i][k];
最初に見る部分は2 D配列値です.配列を格納する場合、行と列の列がメモリに優先的に割り当てられます.従ってarr[0][0~MAX-1]間の値はメモリに記憶され、次いでarr[1][0~MAX-1]間の値である.従って、MAXが4であると仮定し、メモリに記憶されている値を下図に示す.

では、上記のコードの2つのループのうち、どちらがパフォーマンスが優れていますか?1つ目は2つ目のリングよりも性能が優れています.キャッシュは隣接するデータを格納するため、考慮してください.したがって、最初のループは隣接するデータにアクセスするため、キャッシュヒット率がより高い.
最初のループの例を見てみましょう.キャッシュが空の場合にarr[0][0]にアクセスしようとすると、キャッシュにマウントされていないためエラーが発生します.このとき、メインメモリからインポートするとarr[0][0]~arr[0][3]の内容にインポートされるため、次の3番はキャッシュhitとなる.そして、残りの動作も同じならカシメスは4番と見ることができます.
2番目のループについてはarr[0][0]、arr[1][0]、arr[2][0]、arr[3][0]の順にアクセスする.4つとも隣接していないデータであるため、キャッシュエラーが発生し、データにアクセスするたびにキャッシュエラーが発生するため、16回のキャッシュエラーが発生したと考えられる.
もちろん、この例は非常に簡略化され、簡単であるため、このような感覚と考えられるだろう.