コンピューティングにおいて、キャッシュ制御命令は、プログラマまたはコンパイラによって提供されるメモリアクセスパターンの事前知識を使用してハードウェアキャッシュのパフォーマンスを向上させることを目的とした、プロセッサの命令ストリームに埋め込まれたヒントです。[ 1 ]キャッシュ制御命令は、ワーキングセットをより適切に制御することで、キャッシュ汚染を減らし、帯域幅の要件を減らし、レイテンシを回避することができます。ほとんどのキャッシュ制御命令はプログラムのセマンティクスに影響を与えませんが、一部は影響を与える可能性があります。
こうした命令のいくつかは、ARM、MIPS、PowerPC、x86などの複数のプロセッサ命令セットアーキテクチャによって、その派生形も含めてサポートされている。
データ キャッシュ ブロック タッチとも呼ばれるこの操作は、指定されたアドレスに関連付けられたキャッシュ ラインのロードを要求するものです。これは、x86PREFETCH命令セットの命令によって実行されます。一部のバリアントは、キャッシュ階層の上位レベルをバイパスします。これは、ワーキング セットに保持されるのではなく、一度だけ走査されるデータの「ストリーミング」コンテキストで役立ちます。メモリ アクセスのレイテンシを軽減するために、プリフェッチは、メモリを線形に走査するループなど、十分に先のタイミングで実行する必要があります。プログラミング言語CまたはC++では、 GNU コンパイラ コレクションの組み込み関数を使用してこれを呼び出すことができます。__builtin_prefetch
命令キャッシュ用のプリフェッチの変種。
このヒントは、キャッシュラインの内容を完全に上書きする前に、キャッシュラインを準備するために使用されます。この例では、CPUはメインメモリから何もロードする必要はありません。意味的には、キャッシュラインサイズのブロックをゼロにアラインされたmemsetで埋めるのと同等の効果がありますが、この操作は実質的に無料です。
このヒントは、キャッシュラインの内容をメインメモリにコミットせずに破棄するために使用されます。誤った結果が生じる可能性があるため、注意が必要です。他のキャッシュヒントとは異なり、プログラムの動作は大幅に変更されます。これは、allocate zero一時データの管理と組み合わせて使用されます。これにより、不要なメインメモリ帯域幅とキャッシュの汚染を削減できます。
このヒントは、キャッシュラインを即座に削除し、今後の割り当てのためにスペースを確保することを要求します。データがワーキングセットの一部ではなくなったことがわかっている場合に使用されます。
一部のプロセッサは、キャッシュヒントも含むロード/ストア命令のバリアントをサポートしています。例えば、PowerPCload last命令セットでは、データが一度だけ使用されることを示唆しており、つまり、該当するキャッシュラインは、直接必要とされる場合は使用を継続しながら、削除キューの先頭にプッシュされる可能性があります。
近年、IntelやARMの高度なアプリケーションプロセッサ設計では、より多くのトランジスタを従来の言語で記述されたコードの高速化に充てており、例えば、ハードウェアが実行時に線形アクセスパターンを検出する自動プリフェッチなどを実行するようになっているため、キャッシュ制御命令の人気は低下している。しかし、スループット重視のプロセッサでは、スループットとレイテンシのトレードオフが異なるため、これらの技術は依然として有効であり、実行ユニットにより多くの領域を割り当てることを好む場合がある。
一部のプロセッサは 、一時データを格納するためのスクラッチパッドメモリと、必要に応じてメインメモリとの間でデータを転送するためのダイレクトメモリアクセス(DMA)をサポートしています。この方式は、 Cellプロセッサや一部の組み込みシステムで使用されています。これにより、メモリトラフィックと局所性(ワーキングセットが明示的な転送によって管理されるため)をより詳細に制御できるようになり、マルチコアマシンにおける高価なキャッシュコヒーレンシの必要性がなくなります。
欠点は、使用するには大きく異なるプログラミング技術が必要となることです。CやC++などの従来言語で書かれたプログラムは、プログラマーに広大なアドレス空間の均一なビュー(キャッシュによってシミュレートされる錯覚)を提供するため、適応させるのは非常に困難です。従来のマイクロプロセッサは、キャッシュ制御命令によって高速化できるレガシーコードを容易に実行できますが、スクラッチパッドベースのマシンでは、最初から専用のコーディングが必要です。キャッシュ制御命令は特定のキャッシュラインサイズに固有のものであり、実際には同じアーキテクチャファミリのプロセッサの世代間で異なる場合があります。キャッシュは、予測しにくいアクセスパターン(テクスチャマッピング中など)からの読み書きを統合するのにも役立ちますが、スクラッチパッドDMAでは、より予測可能な「線形」トラバーサルのためにアルゴリズムを再構築する必要があります。
そのため、スクラッチパッドは一般的に従来のプログラミングモデルでは使いにくいが、データフローモデル( TensorFlowなど)にはより適しているかもしれない。
ベクトルプロセッサ(例えば、最新のグラフィックス処理ユニット(GPU)やXeon Phiなど)は、大規模な並列処理を利用して高いスループットを実現しつつ、メモリレイテンシを回避(プリフェッチの必要性を低減)しています。多くの読み取り操作は並列に発行され、計算カーネルの次の呼び出しに使用されます。計算は将来のデータを待つ間保留され、実行ユニットは既に取得済みの過去の要求データに基づいて処理を行います。これは、適切なプログラミングモデル(計算カーネル)と組み合わせることでプログラマが活用しやすくなっていますが、汎用プログラミングに適用するのは困難です。
欠点は、処理要素のローカルメモリに、転送中のデータを待つ間、一時的な状態のコピーが多数保持される可能性があることである。