l1およびl2キャッシュリクエストが失敗すると仮定すると、メインメモリがアクセスされるまでプロセッサは停止しますか?
別のスレッドに切り替えるアイデアについて聞いたのですが、もしそうなら、停止したスレッドを起こすのに何が使われますか?
l1およびl2キャッシュリクエストが失敗すると仮定すると、メインメモリがアクセスされるまでプロセッサは停止しますか?
別のスレッドに切り替えるアイデアについて聞いたのですが、もしそうなら、停止したスレッドを起こすのに何が使われますか?
回答:
メモリレイテンシは、コンピューターアーキテクチャの研究で研究されている基本的な問題の1つです。
アウトオブオーダー命令発行による投機的実行では、L1キャッシュヒット中のレイテンシを埋めるために役立つ作業を見つけることができますが、通常は10サイクルまたは20サイクル程度で有用な作業がなくなります。長い待ち時間のミスの間に行うことができる作業の量を増やすために、いくつかの試みがありました。1つのアイデアは、価値予測を試みることでした(Lipasti、Wilkerson and Shen、(ASPLOS-VII):138-147、1996)。この考え方は、しばらくの間、学術建築研究サークルでは非常に流行していましたが、実際には機能していないようです。過去のゴミ箱から価値予測を保存しようとする最後の試みは、実行を早めた(Mutlu、Stark、Wilkerson、およびPatt(HPCA-9):129、2003)。runaheadの実行では、値の予測が間違っていることを認識しますが、とにかく投機的に実行し、予測に基づいてすべての作業を破棄します。ミス。runaheadは非常に多くのエネルギーを浪費するので、それだけの価値はありません。
業界で牽引力を得ているかもしれないこの流れの最後のアプローチには、非常に長いリオーダーバッファの作成が含まれます。命令は分岐予測に基づいて投機的に実行されますが、値の予測は行われません。代わりに、長い待ち時間のロードミスに依存するすべての命令がリオーダーバッファに座って待機します。しかし、リオーダーバッファは非常に大きいため、分岐予測子が適切なジョブを実行している場合は命令をフェッチし続けることができるため、命令ストリームのかなり後の時点で有用な作業を見つけることができます。この分野で影響力のある研究論文は、Continual Flow Pipelinesでした(Srinivasan、Rajwar、Akkary、Gandhi、Upton(ASPLOS-XI):107-119、2004)。(著者はすべてIntelから来ているという事実にもかかわらず、私はこのアイデアがAMDでさらに注目を集めたと信じています。)
レイテンシトレランスに複数のスレッドを使用することの歴史はずっと長く、業界でははるかに大きな成功を収めています。成功したすべてのバージョンは、マルチスレッド用のハードウェアサポートを使用しています。これの最も単純な(そして最も成功した)バージョンは、しばしばFGMT(ファイングレインマルチスレッド)またはインターリーブマルチスレッドと呼ばれるものです。各ハードウェアコアは、複数のスレッドコンテキストをサポートします(コンテキストは、基本的に、命令ポインターや暗黙的なフラグレジスタなどのレジスタを含むレジスタの状態です)。細粒度マルチスレッド・プロセッサの各スレッドが処理されているに-注文。プロセッサは、どのスレッドが長時間のロードミスでストールし、次の命令の準備ができているかを追跡し、各サイクルで単純なFIFOスケジューリング戦略を使用して、そのサイクルを実行する準備ができているスレッドを選択します。この初期の大規模な例は、Burton SmithのHEPプロセッサでした(Burton Smithは、さらにきめ細かいマルチスレッドプロセッサであるTeraスーパーコンピュータを設計しました)。しかし、アイデアははるかにさかのぼり、1960年代に遡ると思います。
FGMTは、ストリーミングワークロードで特に効果的です。最新のGPU(グラフィックスプロセッシングユニット)はすべて、各コアがFGMTであるマルチコアであり、この概念は他のコンピューティングドメインでも広く使用されています。SunのT1もマルチコアFMGTであり、IntelのXeon Phi(しばしば「MIC」と呼ばれ、かつて「Larabee」と呼ばれていたプロセッサー)もそうでした。
考え方マルチスレッド同時処理(Tullsen、エッガース、とレヴィ、(ISCA-22):392から403、1995)は、投機的実行とハードウェアマルチスレッドを兼ね備えています。プロセッサには複数のスレッドコンテキストがありますが、各スレッドは投機的に実行され、順不同で実行されます。その後、より洗練されたスケジューラーは、さまざまなヒューリスティックを使用して、有用な作業を行う可能性が最も高いスレッドからフェッチできます(Malik、Agarwal、Dhar、およびFrank、(HPCA-14:50-61)、2008年)。ある大規模な半導体企業は、ハイパースレッディングという用語を同時マルチスレッド化に使用し始めましたが、その名前は最近最も広く使用されているようです。
あなたのコメントを読み直した後、プロセッサとメモリの間で行われる信号にも興味があることに気付きました。最近のキャッシュでは、通常、複数のミスを同時に未処理にすることができます。これはロックアップフリーキャッシュと呼ばれます(Kroft、(ISCA-8):81-87、1981)。(しかし、この論文はオンラインで見つけるのが難しく、多少読むのが難しい。簡単な答え:簿記はたくさんあるが、あなたはそれを扱うだけだ。ハードウェアの簿記構造はMSHR(ミス情報/ステータス保持レジスタ)と呼ばれる)、これはKroftが彼の1981年の論文で付けた名前です)
簡単な答えは、何もありません、プロセッサが停止することです。
それほど多くの可能性はありません。別のタスクに切り替えることは、実際には2つの理由でオプションではありません。それは高価な操作であり、現在のタスクと他のタスクはキャッシュ内のスペースを奪い合っているため、他のタスクに切り替えるにはメインメモリアクセスが必要になる可能性があり、元のタスクに戻る可能性があります。さらに、これにはオペレーティングシステムが関与する必要があるため、プロセッサは何らかの形式の割り込みまたはトラップをトリガーする必要があります。実際、プロセッサはカーネルコードに切り替えます。
プロセッサが停止している間、タイマーは実行を継続するため、タイマー割り込みが発生したり、他の周辺機器からの割り込みが発生したりする可能性があります。そのため、コンテキストアクセスはキャッシュアクセス中よりもメインメモリアクセス中に発生する可能性が高くなりますが、それは時間がかかるためです。
それにもかかわらず、現代のコンピュータには、メインメモリを待機するプロセッサで浪費される時間を削減しようとするさまざまな技術が含まれています。ストールは発生しますが、回避できない場合に限ります。
1つの手法は投機的フェッチです。プロセッサは、アクセスされるメモリ位置を推測し、事前にキャッシュにフェッチします。たとえば、メモリブロックのループは一般的であるため、メモリアドレス0x12340000、0x12340010、および0x12340020のキャッシュラインがロードされている場合、0x12340030のラインをロードすることをお勧めします。コンパイラは、データをメインメモリからプロセッサレジスタではなくキャッシュに転送する以外はロードのようなプリフェッチ命令を生成することで役立ちます。
別の手法は投機的実行ですです。プロセッサは、ロードが実行される前に次の命令の実行を開始します。とにかく、これは命令のパイプライン化のために自然に起こります。この方法で実行できるのは、ロードされた値に依存しない命令のみです。プロセッサは依存関係分析を実行する必要があります。条件付き命令(たとえば、r1をロード、r1≠0の場合の分岐)の場合、プロセッサは分岐予測ヒューリスティックを使用して値が何であるかを推測します。ロードがアボートをトリガーした場合、ロード後の投機的実行を巻き戻す必要があります。
などのいくつかのアーキテクチャ Itaniumは、デフォルトで命令の並べ替えを許可することにより、便利な順序で命令の実行を容易にします。次々に意味的に実行される基本命令のシーケンスで構成されるのではなく、プログラムは非常に長い命令語で構成されます。プロセッサのさまざまなコンポーネントによって並列に実行される多くの操作。
別のスレッドへの切り替えは ハイエンドx86プロセッサーで見られるハイパースレッディングでます。これはハードウェア設計手法です。各プロセッサコアには2つの個別のレジスタバンク(それぞれタスクコンテキストに対応)が含まれますが、他の要素の単一インスタンスであるため、2つの独立した実行スレッドをサポートできますが、1つの時間。1つのスレッドが停止している間、他のスレッドは処理を続行します。ソフトウェアの観点からは、2つの独立したプロセッサがあります。これらのプロセッサが内部で多くのコンポーネントを共有しているだけです。
スワップは、メモリキャッシュ階層のもう1つのレベルです。メインメモリは、スワップ領域のキャッシュと見なすことができます。スワッピングでは、メカニズムとパフォーマンス比が異なります。タスクがスワップからデータをロードする必要がある場合、ロード命令はカーネルコードを実行してRAMにページを割り当て、そのコンテンツをディスクからロードするトラップをトリガーします。これが発生している間、カーネルは別のタスクに切り替えることを決定するかもしれません。
この質問に対する答えは、問題のアーキテクチャによって異なります。多くのCPUはスレッドの切り替えに時間がかかりすぎるために停止しますが(ARM、x86ハイパースレッドなしなど)、それはすべてのアーキテクチャで採用されているアプローチではありません。一部のアーキテクチャでは、CPUでスケジュールされた各スレッドに独自の独立したレジスタファイルがあるため、プロセッサはメモリアクセスを待機していないスレッドから単純に作業を実行できます。これは、限られた範囲で、x86ハイパースレッディングが行うこと(2つのスレッドのみを使用)であると理解していますが、GPGPUでははるかに一般的ですアーキテクチャ。CUDAの特定のケースでは、通常、少なくとも数百ではないにしても数十のスレッドのワープが特定のマルチプロセッサーにロードされ、各スレッド(数百または数千)が独自のレジスターを持ちます。これにより、特定のスレッドがメモリアクセスを発行する次のサイクルで、アーキテクチャが別のスレッドから命令を実行できます。したがって、十分に多くのスレッドがロードされている限り、プロセッサコアはメモリアクセスのためにアイドル状態になることはありません。詳細については、パフォーマンスガイドラインとメモリ階層を参照してください。