2016-08-08 7 views
0

さまざまなキャッシュがプロセッサでどのように使用されているかを理解しようとしています。 67バイトの配列の各値をインクリメントしているとします。 32ビットのLinux OSを想定します。プロセッサキャッシュの使用方法の理解

キャッシュラインが64バイトであると仮定します。今、私は次のコードを持っています -

add() 
{ 
    unsigned char a[67] = {0}; 
    for(int i=0; i<67; i++) 
     a[i] = a[i] + 4; 
} 

誰かがこの機能のためにプロセッサキャッシュを使用する方法を説明できますか?キャッシュラインの概念を正しく理解すると、プロセッサがバイトをL1にコピーするたびに、64バイトのデータがコピーされますか?

コンパイラは、キャッシュを効率的に使用するためにこのコードをどのように最適化しますか?

質問が完全なナンセンスなら、どうか教えてください。

答えて

0

正確な答えは、システムの実装など、あまりにも多くのパラメータに依存しますが、私は1ヶ月だったので私の直感をつかむようにします。


あなたはすでにこれを知っているが、私はaは67バイトの大きさを持っていることに注意してみましょうことがあります。

#include <stdio.h> 

int main(void) 
{ 
    unsigned char a[67] = {0}; 
    printf("%zu\n", sizeof(a)); // prints 67 
    return 0; 
} 

当社のキャッシュは64バイトなので、のは、それが64を保持できると仮定しましょうそれが完全に空のときaの細胞。

コードのループが実行を開始します。iは変数で、ではなく、がキャッシュされると仮定して、簡単に答えを出します。

あなたのコードはa[i]にアクセスしようとするので、私たちは、キャッシュ内のルックアップが、何も見えない(キャッシュはプログラムの開始時に、すなわち常に、空であるときには、コールドスタートと呼ばれ、キャッシュミスのために強制的に)。

aの最初の64バイトは、OSがアレイ全体を1として扱うと仮定して、キャッシュにコピーされます。

a[i]をi = 0で更新しました。a[i]に再度アクセスすると、そのビットはダーティとマークされ、キャッシュルックアップはミスになります。


Nextループ、我々はキャッシュをチェックし、a[1]をしたい、万歳!、それはすでにありますので、我々は、キャッシュヒットを持っています。そして、配列全体が収まりきらないので、キャッシュにないa[64]をリクエストするまで続きます。

OSはa[64]をフェッチしますが、a[65]a[66]も同様に取得する可能性があるため、問題は誰に置き換えの対象になるのでしょうか。

担当する置換ポリシーで犠牲者を選択し、a[65]を要求すると、a[64]と一緒にフェッチされたと仮定すると、キャッシュヒットします。

何が起こるかの非常に近似し、何とか不正確概要でしたが、ここでのポイントは、あなたの直感を与えることです、それは助けを願ってい

! :)

関連する問題