最新のマルチコア プロセッサでは、通常、ローカル L1 キャッシュがありますが、共有 L2 キャッシュがあります。L2 キャッシュを使用しながら、メモリの一部の L1 キャッシュをバイパスすることは可能ですか? タイミングの予測可能性を向上させるためにこれを行いたいのですが、パフォーマンスが犠牲になる可能性があります。
2 に答える
私の知る限り、主流の CPU で L1 キャッシュをバイパスする方法はありません。
ただし、目標を達成する (つまり、タイミング測定の変動を引き起こす可能性のあるキャッシュ ミスを回避する) ために、コンパイラにデータをキャッシュにプリフェッチするように依頼することができます。
GCC または LLVM を使用する場合は、__builtin_prefetchを参照してください。
しかし、あなたの質問は非常に曖昧であり、あなたの提案があなたのニーズに合っているかどうか確信が持てません.
キャッシュ
キャッシュの機能とその目的を誤解していると思います。
キャッシュは、メモリの内容の観点から透過的です。1 つのコアがメモリ位置に書き込むと、そのキャッシュ (L1、L2、L3 など) が共有されているかどうかに関係なく、たまたまその場所をキャッシュしている他のすべてのコアも更新されます。
これは、コアが値を求めて競争できないという意味ではないことに注意してください。あるコアが場所を部分的に読み取ってから、別のコアが「間違った値を取得する」という競合状態が発生する可能性があります。さらに、CPU に何らかの種類のキャッシュがあるかどうかに関係なく発生します。この「順序付け」の問題を解決するには、ソース コードでセマフォまたはその他の IPC プリミティブを使用する必要があります。
一部のキャッシュ システムでは、「ヒントをドロップ」することができます。Matthieu Rouget は __builtin_prefetch でその例を示しました。これらの種類のことにより、プログラマーは、事前にデータを取得する価値がある可能性があることをキャッシュ システムに伝えることができます。一部のシステム (PowerPC 7450 など) では、プログラマーがキャッシュの一部をキャッシュの代わりにメモリとして使用することができました。これは、究極のプログラマー キャッシュ制御の一種です。
ただし、これらのいずれも、すべてのキャッシュが持つメモリのビューに違いはありません。1 つのキャッシュのコンテンツが更新されると、残りも更新されます。
キャッシュとパフォーマンス プログラミング
最高のプログラマーは、キャッシュの動作に関するコーディングを行うことで、CPU からピーク パフォーマンスを引き出すことができます。その領域では、通常、キャッシュがまったく存在しないことを望んでいます。その究極の具現化がPS3のCellプロセッサーです。キャッシュがまったくない数学コア。代わりに、プログラムが要求するデータを推測するためにキャッシュを残すのではなく、実際にはすべて独自のデータ フェッチを行い、ソース コードに書き戻す必要があります。それを正しく取得すると、パフォーマンスは依然として猛烈に優れています。
バスのスヌーピング
一部の CPU にはキャッシュ バス スヌーピングがありません。これは、デバイス ドライバーを作成する際に特に問題になる可能性があります。バス スヌーピングは、CPU キャッシュが、CPU コア以外の何かによって更新されているメモリの内容を検出するメカニズムです (たとえば、DMA コントローラがデバイスからデータを読み取ることによって)。逆の場合も同様です。メモリからの DMA は、現在キャッシュにスタックされている値を取得します。私の知る限り、最近のほとんどすべての CPU はバス スヌーピングを行っているため、問題になることはほとんどありません。
IO とメモリ アドレス空間 (Intel など) を備えたシステムでは、とにかく I/O アドレス空間がキャッシュされるとは思いません。メモリがマップされたデバイスを持つシステムでは、通常、メモリもキャッシュされず、OS がそのように CPU をセットアップします (これを参照)。
タイミングの予測可能性
質問の理由に戻ります-タイミングの予測可能性。間違ったテクノロジーを使用している可能性があります。システムにタイミング制約があり、それによって問題がメイン メモリの書き込み時間の変動である場合、率直に言って、マルチコア CPU を使用することはそもそも間違っているように思えます。@Griwesはその点(そして実際にはコメント全体)で非常に正しいです。おそらく、FPGA に沿った純粋なハードウェア設計に頼る必要があるでしょう (ファームウェアが本当にソフトウェアであるかどうかについてのコメントはありません!)。
私が思うに、セマフォやその他の IPC プリミティブを使用してシステム内の 2 つのスレッドを同期することを実際に回避しようとしている場合は、キャッシュを共有するかどうかにかかわらず、成功することはありません。コードを正しく動作させるには、セマフォなどを使用する必要があります。