7

用語の定義は理解していますが、それらの概念をコードに適用するのに問題があります。演習では、次のコードが空間的であるか時間的であるかを説明するように求められます。

for (int i=0; i<10; i++) {
    printf(some_array[i]);
}

配列の1つのインデックスにアクセスすると、ループが繰り返されるとすぐに次のインデックスメモリの場所にアクセスするため、これは空間的な局所性のように感じます。これはそれを見る正しい方法ですか?コードが時間的であるか空間的であるかを決定するものは何ですか?より多くの例が素晴らしいでしょう。

4

4 に答える 4

11

本当に、ちょっとばかげた運動です。コードは時間的または空間的ではありません。

ただし、時間的な局所性とは、同じアドレスに複数回、比較的時間的に接近してアクセスすることを意味します。ここではそれを行っていないので(アクセスを数えない限りi)、排除のプロセスによって、これは空間的な局所性であるに違いないと結論付けることができます。

より正確には、、、などにアクセスしていますsome_array[0]some_array[1]これらはアドレス空間で近接しているため、そうです、これは空間的な局所性に「依存」している可能性があります。

于 2011-08-31T23:55:42.727 に答える
5

これらの概念が通常出てくるハードウェアキャッシュメモリのコンテキストでは、分析は通常、いわばメモリアドレスベースで実行されません。局所性は、キャッシュとメインメモリ間で転送されるメモリブロックへのアクセスによって分析されます。

そのように考えると、コードには時間的および空間的な局所性があります。コードが読み取られたときsome_array[0]に、そのアドレスがキャッシュに見つからない場合は、メインメモリから読み取られ、それを含むブロック全体がキャッシュにコピーされます。これは、特定のポリシーに従って他のブロックを置き換えます。たとえば、MRUです。

その後、しばらくしてアクセスsome_array[1]すると、そのブロックはすでにキャッシュにあるため、読み取り時間は短くなります。同じブロックに短時間でアクセスしたことに注意してください。つまり、空間的および時間的な局所性があります。

キャッシュメモリは、空間的および時間的な局所性を利用して、より高速なメモリアクセスを提供します。一方、コードがこれを利用できるかどうかは、まったく別の問題です。それでも、コンパイラはほとんどの最適化を実行するため、プロファイルセッションでボトルネックを見つけた後でのみ、これに注意を払う必要があります。Linux環境では、Cachegrindはこれに最適です。

于 2011-09-01T00:32:49.403 に答える
2

このコードは、ループごとにコードを繰り返しているため、命令キャッシュに一時的な局所性があります(オプティマイザーがループを展開しなかったと仮定します)。また、配列要素iにアクセスすると、すぐに要素i + 1、i + 2などにアクセスするため、データキャッシュに空間的な局所性があります。データキャッシュの行サイズが16バイトで、配列が32ビットの整数の場合、要素0を要求したときに、データキャッシュは要素1、2、および3もロードしました(配列がキャッシュラインの境界で開始されたと仮定します)。

于 2013-07-11T22:00:12.087 に答える
1

キャッシュメモリアクセスのコンテキストでは、コードには空間的な局所性のみがあり、時間的な局所性はありません。

データをキャッシュにロードしている間、ライン/ブロック全体がロードされます。したがって、キャッシュ内の同じブロックの一部でもあるアドレスだけでなく、まったく同じメモリ位置への後続のアクセスでは、アクセス時間が速くなります。

メインメモリから直接ではなく、キャッシュから多くの読み取りが行われるようにコードを最適化する方法があります。1.最初のキャッシュミスを利用するだけで、近くのすべてのメモリアドレスにアクセスできる場合、この前にブロックはキャッシュから削除されます-次に、空間的な局所性を利用します。2.キャッシュ内のブロックが削除される前に、プログラムで必要な回数だけ同じメモリ位置にアクセスする場合は、一時的な局所性を利用します。

行列の乗算のような例には、時間的および空間的な局所性があります。

于 2011-09-01T02:09:30.937 に答える