キャッシュされた動作:例れい
CPUのキャッシュはハードウェアレベルで制御される.したがって、プログラマは直接制御できません.しかし、間接的な制御方法もある.まず、次のコードを見てみましょう.
では、上記のコードの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回のキャッシュエラーが発生したと考えられる.
もちろん、この例は非常に簡略化され、簡単であるため、このような感覚と考えられるだろう.
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回のキャッシュエラーが発生したと考えられる.
もちろん、この例は非常に簡略化され、簡単であるため、このような感覚と考えられるだろう.
Reference
この問題について(キャッシュされた動作:例れい), 我々は、より多くの情報をここで見つけました https://velog.io/@sivese/캐시의-동작-예시テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol