3

私のアレイが 32KB、L1 が 64KB だとしましょう。プログラムの実行中にWindowsはその一部を使用しますか? Windows が他のプログラムを動作させているため、L1 を使用できないのでしょうか? すべてのキャッシュを使用するようにプログラムの優先順位を設定する必要がありますか?

for(int i=0;i<8192;i++)
{
  array_3[i]+=clock()*(rand()%256);//clock() and rand in cache too?
  //how many times do I need to use a variable to make it stay in cache?
  //or cache is only for reading? look below plz
  temp_a+=array_x[i]*my_function();
}

プログラムは C/C++ です。

L2も同様にお願いします。

また、関数はキャッシュに保持されますか? キャッシュは読み取り専用ですか? (アレイを変更すると、キャッシュ結合が失われますか?)

コンパイラは、キャッシュをより多く生成するために asm コードを作成しますか?

ありがとう

4

6 に答える 6

14

アレイがキャッシュにあることをどのように確認できますか?

一般的には、できません。一般に、キャッシュは Windows ではなく、ハードウェアによって直接管理されます。また、データがキャッシュに存在するかどうかを制御することもできません (ただし、メモリの領域をキャッシュしないように指定することは可能です)

プログラムの実行中にWindowsはその一部を使用しますか? Windows が他のプログラムを動作させているため、L1 を使用できないのでしょうか? すべてのキャッシュを使用するようにプログラムの優先順位を設定する必要がありますか?

L1 および L2 キャッシュは、特定のコアで実行されているすべてのプロセスによって共有されます。プロセスの実行中は、すべてのキャッシュが使用されます (必要な場合)。コンテキストの切り替えがあると、2 番目のプロセスが必要とするものに応じて、キャッシュの一部またはすべてが削除されます。そのため、次にコンテキスト スイッチがプロセスに戻ったときに、キャッシュを最初からやり直す必要がある場合があります。

繰り返しますが、これはすべてハードウェアによって自動的に行われます。

関数もキャッシュに保持されますか?

最近のほとんどのプロセッサでは、命令用に個別のキャッシュがあります。たとえば、Intel Nehalem アーキテクチャの構成を示す次の図を参照してください。L2 キャッシュと L3 キャッシュは共有されていますが、L1 キャッシュは命令とデータ用に分離されていることに注意してください。

キャッシュは読み取り専用ですか?(アレイを変更すると、キャッシュ結合が失われますか?)

いいえ。キャッシュは変更されたデータを処理できますが、これはかなり複雑になります (マルチコア システムで複数のキャッシュを同期する際の問題のため)。

コンパイラは、より多くのキャッシュを使用するために asm コードを作成しますか?

通常、キャッシュ アクティビティはすべてハードウェアによって自動的に処理されるため、特別な指示は必要ありません。

于 2012-07-15T14:40:55.220 に答える
1

どのデータがキャッシュにあり、どのデータがキャッシュにないかわからない場合でも、使用しているキャッシュの量がわかる場合があります。最新のプロセッサには非常に多くのパフォーマンスカウンタがあり、そのうちのいくつかはキャッシュに関連しています。Intelのプロセッサは、L1とL2のミスがいくつあったかを教えてくれるかもしれません。それを行う方法の詳細については、これを確認してください:i5、i7CPUのパフォーマンスカウンターを読み取る方法

于 2012-07-15T15:49:14.427 に答える
1
  • キャッシュはオペレーティング システムによって直接制御されず、ハードウェアで実行されます。

  • コンテキスト スイッチの場合、別のアプリケーションがキャッシュを変更する可能性がありますが、これは気にする必要はありません。プログラムがキャッシュに優しくない動作をするケースを処理することがより重要です。

  • 関数はキャッシュに保持されます (I-Cahce 、命令キャッシュ)

  • キャッシュは読み取り専用ではありません。何かを書き込むと、[メモリと]キャッシュに移動します。

于 2012-07-15T14:43:57.463 に答える
1

私の知る限り、キャッシュに何が入るかを制御することはできません。変数を として宣言するregister var_type aと、その変数へのアクセスは 1 サイクル (または少数のサイクル) になります。さらに、メモリのチャンクにアクセスするのにかかるサイクル数は、仮想メモリの変換と TLB にも依存します。register キーワードは単なる提案であり、コメントで示唆されているように、コンパイラは完全に自由に無視できることに注意してください。

于 2012-07-15T14:43:58.587 に答える
1

他の人が述べているように、通常、キャッシュの内容を制御することはできません。高パフォーマンスのためにコードを作成していて、パフォーマンスのためにキャッシュに依存する必要がある場合、L1 キャッシュの約半分のスペースを使用するようにコードを作成することは珍しくありません。そのための方法には、StackOverflow の質問の範囲を超えた多くの議論が含まれます。基本的に、他のデータに移る前に、いくつかのデータに対してできるだけ多くの作業を行う必要があります。

実際に何が機能するかという問題として、キャッシュの約半分を使用すると、他のことが発生するのに十分なスペースが残り、ほとんどのデータがキャッシュに残ります。オペレーティング システムやその他のコンピューティング プラットフォームの協力がなければ、これに頼ることはできないため、研究計算を高速化するには有用な手法かもしれませんが、危険な機械の操作など、リアルタイムのパフォーマンスが保証されなければならない場合には使用できません。 .

使用するデータ量以外にも注意事項があります。同じキャッシュ ラインにマップされるデータを使用すると、使用されていないキャッシュがたくさんある場合でも、キャッシュからデータを追い出すことができます。行の長さが適度な 2 のべき乗の倍数である行列には、要素がキャッシュ ラインの小さなセットにマップされる列があるため、行列の転置はこれで悪名高いです。したがって、キャッシュを効率的に使用することを学ぶことは重要な仕事です。

于 2012-07-15T15:19:15.090 に答える
1

キャッシュは、主にハードウェアによって制御されます。ただし、特にキャッシュが原因で、Windows スケジューラは以前と同じコアにスレッドの実行をスケジュールする傾向があることを知っています。それらを別のコアにリロードする必要があることを理解しています。Windows は、少なくとも Windows 2000 以降、この動作を使用しています。

于 2012-07-15T14:45:48.133 に答える