2017-12-04 4 views
0

アレイ上に二つのループを考える:キャッシング - RAMアクセス時間

int *arr = new int[1024 * 1024]; 
// Loop1 
for (int i = 0; i < n; i++) arr[i] *= 3; 
// Loop2 
for (int i = 0; i < n; i += 16) arr[i] *= 3; 

どちらもランダウの記号にはO(n)であるように、しかし、彼らは、RAMアクセスの同じ数を有します。すなわち同じ数のキャッシュミスを生じる。

なぜ同じ数のRAMアクセスがありますか?ループ2は、各訪問後にRAMアクセスが少なくなりますが、私は16だけインクリメントされますか?

+1

どのようなOSですか?どのプロセッサですか?コンパイラは何ですか?あなたは情報なしで特定の質問をしています。その答えが何であれ、それはおそらく複雑すぎるでしょう。 – Stargateur

+0

こんにちはStargateur、それはc/C++言語に特有の一般的なコンピュータサイエンスの話題です.OSはUnixやLinuxが理想的です。異なる機械とハードウェアは答えに影響してはならない。 –

+3

@JasonLiuキャッシュの詳細は、ハードウェア固有のものです。 – molbdnilo

答えて

2

キャッシュは、常に行の粒度でアクセス/管理されます。キャッシュラインには複数の要素が存在します。私はあなたのキャッシュラインが16要素以上を保持することができると考えているので、1つのRAMアクセスは隣接するすべての要素をキャッシュにロードし、さらにRAMアクセスは次の16バイトには必要ありません。

+0

この方法では、ループからアレイからのデータアクセスが必要になると、システムは最初に配列がキャッシュにあるかどうかをチェックします。そうでない場合、配列は完全にキャッシュにコピーされます。 –

+1

@JasonLiu配列ではなく、キャッシュライン。キャッシュラインのサイズが64バイトであるとします。読み込みが発生した場合、それが含まれている64バイトのセグメント全体がキャッシュにロードされます。 – vu1p3n0x

関連する問題