メインメモリのフェッチを待っている間にプロセッサは何をしますか


26

l1およびl2キャッシュリクエストが失敗すると仮定すると、メインメモリがアクセスされるまでプロセッサは停止しますか?

別のスレッドに切り替えるアイデアについて聞いたのですが、もしそうなら、停止したスレッドを起こすのに何が使われますか?


4
どのような研究をしましたか?これは確かに入手可能な情報です。専門家に答えるつもりはありますが、スレッドスイッチは便利なことだとは思いません。一般的に、CPUでコンテキストを切り替えると、多くのメモリアクセスが発生します(したがって、おそらくキャッシュミスが発生します)。操作の並べ替え(パイプラインの使用)などの手段がありますが、停止は代替手段がないようです。
ラファエル

@Raphael主にコンピューターアーキテクチャの本を読んでいます。スティーブファーバーのARM System-on-Chip Architectureは、おそらく私が完全に読んだ中で最も包括的なものでした。しかし、コンピュータアーキテクチャ:定量的アプローチを読み始めました。スレッドスイッチング、OOE、アウトオブオーダーメモリ操作などのストールを回避するためのテクニックについて議論しますが、ほとんどの教科書のように古いアーキテクチャを扱っているか、これらのことについて漠然とした提案をしているように、現代のデザインの複雑さについてはあまり説明していません実装して連携します。
102948239408 14

私の質問を拡大すると、キャッシュのレイテンシは小さく、応答が確定的であるように見えますが、物理アドレスを取得するために最悪の場合のシナリオページテーブルウォークがある場合、ILPによって抽出された同じスレッドからの一部の命令が完了する可能性があります。別のスレッドをスケジュールすることを決定するためにプロセッサで発生するハードウェアの相互作用と、これが発生した場合にそのスレッドを起動するために使用される通信。さらに、OoOEがスレッドを切り替えるときに完全な結果キューを処理するための手法がある場合はどうでしょうか?
102948239408 14

1
あなたの質問から、最新のCPUの詳細に興味があるかどうかは明らかではありません。それはおそらくオフトピックであるだけでなく、専有情報である可能性もあります。概念を使用して、私たちはあなたを助けることができます。これらはおそらく、実装よりも数十年にわたって変化が少ないでしょう。あなたの質問については、あなたが知っていることを組み込み、特定の概念的な(または参照リクエスト)質問を作成してください。
ラファエル

1
私は一般的な概念について答えましたが、あなたのコメントから判断すると、あなたはより高度な考慮の後にいるかもしれません。ただし、より高度な回答が必要な場合は、質問を特定のアーキテクチャや手法の種類に特定する必要があります。
ジル 'SO-悪であるのをやめる' 14

回答:


28

メモリレイテンシは、コンピューターアーキテクチャの研究で研究されている基本的な問題の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年の論文で付けた名前です)


本当に包括的な答えをありがとう、私はロックアップのないキャッシュを試してみます。私のひどい言葉遣いの質問は、メインメモリアクセス中にプロセッサがロードとストアを続行したこと、およびこれを行うためにどのようなマイクロアーキテクチャ技術が使用されたかを本当に確認しようとしていました。
102948239408 14

+1、1。ラウンドロビンスケジューリングを使用しない場合、本当にバレル処理ですか?ウィキペディアは、FGMTの同義語になっています。(「バレルプロセッサ」をスキップ付きのラウンドロビンに適用することは受け入れられますが、不足しているステーブ(準備ができていないスレッドを参照)はバレルの円周を縮めないというアナロジーを破ります。 ?。ItaniumベースのハイパースレッディングとIBMのノーススターらのようなSoEMTの稀おそらくCDC 6600用の周辺プロセッサ、彼らはサイクルを無駄に-becauseが、それは簡素化ハードウェアをする)2. Aの言及は特に問題与えられた適切と思われる。。
ポールA.クレイトン14

@ 102948239408、グーグルで検索できるもう1つのことは、「ミスアンダーヒット」や「ミスアンダーアンダー」などの用語です(他のオプションは「ミスアンダーストール」ですが、試してみましたが、何も役に立たないようです)。キャッシュが許可する可能性のあるさまざまなオプションのために(一部の)アーキテクトによって現在使用されている用語。
さまよう論理

@ PaulA.Clayton、用語は間違いなく私の強力なスーツではありません。私は、バレル処理がラウンドロビンを意味することに同意します。しかし、他の用語を考えることはできません:順番に並んだスレッドのサイクルごとのインターリーブ(GPU、Xeon Phi、およびSun T1がすべて行うことです)。FGMTですか?私は常にFGMTにSMTが含まれていると考えていました(つまり、スレッドを順番に実行するように指定していません)が、この場合は「バレルプロセッサ」よりもFGMTの方が良いのでしょうか。
さまよう論理

ウィキペディアのバレルプロセッサの記事には、「「インターリーブ」または「ファイングレイン」時間マルチスレッドとしても知られている」と記載されているため、IMTとFGMTは少なくとも認められている用語です。「インターリーブ」より「ファイングレイン」を読みましたが、インターリーブは珍しくありません。私は一般的にFGを使用しました(私にとって「粒度が粗い」とは、SMTが提供するよりも多くの分離を意味します)。FGには、InterleavedがSoEMTに適用できるという利点があります。これは「バレルプロセッサ」の使用方法の変更に過ぎないのではないかと疑っています。
ポールA.クレイトン

16

簡単な答えは、何もありません、プロセッサが停止することです。

それほど多くの可能性はありません。別のタスクに切り替えることは、実際には2つの理由でオプションではありません。それは高価な操作であり、現在のタスクと他のタスクはキャッシュ内のスペースを奪い合っているため、他のタスクに切り替えるにはメインメモリアクセスが必要になる可能性があり、元のタスクに戻る可能性があります。さらに、これにはオペレーティングシステムが関与する必要があるため、プロセッサは何らかの形式の割り込みまたはトラップをトリガーする必要があります。実際、プロセッサはカーネルコードに切り替えます。

プロセッサが停止している間、タイマーは実行を継続するため、タイマー割り込みが発生したり、他の周辺機器からの割り込みが発生したりする可能性があります。そのため、コンテキストアクセスはキャッシュアクセス中よりもメインメモリアクセス中に発生する可能性が高くなりますが、それは時間がかかるためです。

それにもかかわらず、現代のコンピュータには、メインメモリを待機するプロセッサで浪費される時間を削減しようとするさまざまな技術が含まれています。ストールは発生しますが、回避できない場合に限ります。

1つの手法は投機的フェッチです。プロセッサは、アクセスされるメモリ位置を推測し、事前にキャッシュにフェッチします。たとえば、メモリブロックのループは一般的であるため、メモリアドレス0x12340000、0x12340010、および0x12340020のキャッシュラインがロードされている場合、0x12340030のラインをロードすることをお勧めします。コンパイラは、データをメインメモリからプロセッサレジスタではなくキャッシュに転送する以外はロードのようなプリフェッチ命令を生成することで役立ちます。

別の手法は投機的実行ですです。プロセッサは、ロードが実行される前に次の命令の実行を開始します。とにかく、これは命令のパイプライン化のために自然に起こります。この方法で実行できるのは、ロードされた値に依存しない命令のみです。プロセッサは依存関係分析を実行する必要があります。条件付き命令(たとえば、r1をロード、r1≠0の場合の分岐)の場合、プロセッサは分岐予測ヒューリスティックを使用して値が何であるかを推測します。ロードがアボートをトリガーした場合、ロード後の投機的実行を巻き戻す必要があります。

などのいくつかのアーキテクチャ Itaniumは、デフォルトで命令の並べ替えを許可することにより、便利な順序で命令の実行を容易にします。次々に意味的に実行される基本命令のシーケンスで構成されるのではなく、プログラムは非常に長い命令語で構成されます。プロセッサのさまざまなコンポーネントによって並列に実行される多くの操作。

別のスレッドへの切り替えは ハイエンドx86プロセッサーで見られるハイパースレッディングでます。これはハードウェア設計手法です。各プロセッサコアには2つの個別のレジスタバンク(それぞれタスクコンテキストに対応)が含まれますが、他の要素の単一インスタンスであるため、2つの独立した実行スレッドをサポートできますが、1つの時間。1つのスレッドが停止している間、他のスレッドは処理を続行します。ソフトウェアの観点からは、2つの独立したプロセッサがあります。これらのプロセッサが内部で多くのコンポーネントを共有しているだけです。

スワップは、メモリキャッシュ階層のもう1つのレベルです。メインメモリは、スワップ領域のキャッシュと見なすことができます。スワッピングでは、メカニズムとパフォーマンス比が異なります。タスクがスワップからデータをロードする必要がある場合、ロード命令はカーネルコードを実行してRAMにページを割り当て、そのコンテンツをディスクからロードするトラップをトリガーします。これが発生している間、カーネルは別のタスクに切り替えることを決定するかもしれません。


最初と最後から2番目の段落を比較すると、「トリック」は、ハイパースレッディングで実際のコンテキスト切り替えを行う必要がないということですよね?CPUは2つのコンテキストを同時に完全に維持します。
ラファエル

1
@Raphael正しい:ソフトウェアに関する限り、パフォーマンス以外のすべてのために、2つのCPUがあります。
ジル「SO-悪であるのをやめる」

ハイパースレッドCPUには、多くの半独立した実行ユニット(整数および浮動小数点加算器、乗算器など)があり、両方のコンテキストが別々の実行ユニットを同時に使用できると思いますが、これについては100%確信できません。
ラッセルボロゴーブ14

でも、非ハイパースレッドCPUが持つことができるのではい@RussellBorogove、私はそれを言及していない複数のALU / FPU / ...と逆に別のコアは、時々共有FPUなど
ジル「SO-停止されて悪」

5

この質問に対する答えは、問題のアーキテクチャによって異なります。多くのCPUはスレッドの切り替えに時間がかかりすぎるために停止しますが(ARM、x86ハイパースレッドなしなど)、それはすべてのアーキテクチャで採用されているアプローチではありません。一部のアーキテクチャでは、CPUでスケジュールされた各スレッドに独自の独立したレジスタファイルがあるため、プロセッサはメモリアクセスを待機していないスレッドから単純に作業を実行できます。これは、限られた範囲で、x86ハイパースレッディングが行うこと(2つのスレッドのみを使用)であると理解していますが、GPGPUでははるかに一般的ですアーキテクチャ。CUDAの特定のケースでは、通常、少なくとも数百ではないにしても数十のスレッドのワープが特定のマルチプロセッサーにロードされ、各スレッド(数百または数千)が独自のレジスターを持ちます。これにより、特定のスレッドがメモリアクセスを発行する次のサイクルで、アーキテクチャが別のスレッドから命令を実行できます。したがって、十分に多くのスレッドがロードされている限り、プロセッサコアはメモリアクセスのためにアイドル状態になることはありません。詳細については、パフォーマンスガイドラインメモリ階層を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.