マルチコアおよびメニーコア プロセッサのマイクロスレッドは、マルチスレッド アーキテクチャと同様にメモリ遅延を隠すメカニズムです。ただし、メモリ遅延や I/O 操作によって発生する遅延を動的に隠すために、Cell Broadband Engine などのマルチコア プロセッサではソフトウェア で実行されます。
導入
マイクロスレッディングは、マルチコアまたはメニーコア プロセッサ内に小さなスレッドを作成するソフトウェア ベースのスレッド フレームワークです。各コアには、アイドル時間を利用する 2 つ以上の小さなスレッドが存在する場合があります。これは、Intel が発明したハイパースレッディングや、最新のマイクロプロセッサの一般的なマルチスレッディング アーキテクチャに似ています。これにより、システムのメイン メモリへの高価なコンテキスト スイッチングを実行することなく、同じコアで複数のスレッドを実行できます (このコアにマルチスレッディングハードウェア ロジックがない場合でも)。マイクロスレッドは主に、計算とメモリ要求をオーバーラップすることで、各コア内のメモリ レイテンシを隠します。マイクロスレッドと現在のスレッド モデルの主な違いは、マイクロスレッドのコンテキスト スイッチング オーバーヘッドが非常に小さいことです。たとえば、Cell Broadband Engineでのマイクロスレッド実装のオーバーヘッド は 160 ナノ秒ですが、コア全体の (SPE) スレッドのコンテキスト スイッチングのオーバーヘッドは約 2000 マイクロ秒です。この低いオーバーヘッドは、主に 3 つの要因によるものです。まず、マイクロスレッドは非常に小さいです。各マイクロスレッドは、1 つまたは 2 つの単純だが重要な関数を実行します。2 番目に、マイクロスレッドのコンテキストには、現在マイクロスレッドが実行されているコアのレジスタ ファイルのみが含まれます。3 番目に、マイクロスレッドはコアの専用キャッシュにコンテキスト スイッチされるため、このプロセスは非常に高速かつ効率的になります。
背景
マイクロプロセッサは、主に数か月ごとにコアが追加されることによって高速化していますが、メモリ レイテンシのギャップは拡大しています。メモリ レイテンシは 1980 年には数サイクルでしたが、現在ではほぼ 1000 サイクルに達しています。マイクロプロセッサに十分な数のコアがあり、それらのコアが同時にメイン メモリに要求を送信していないことが望まれる場合、メモリ レイテンシは部分的に集約的に隠蔽されます。一部のコアが実行中である一方で、他のコアはメモリ応答を待機している可能性があります。これは、マルチコア プロセッサにとって最適な状況ではありません。ハイ パフォーマンス コンピューティングの専門家は、すべてのコアを常にビジー状態に維持しようと努めています。したがって、各コアを常にビジー状態に維持すれば、マイクロプロセッサ全体を完全に利用することができます。ソフトウェア ベースのスレッドを作成しても、1 つの明白な理由から、問題は解決しません。スレッドをメイン メモリに切り替えるコンテキストは、メモリ レイテンシと比較すると、はるかにコストのかかる操作です。たとえば、Cell Broadband Engine では、コアのスレッドのいずれかのコンテキスト切り替えには、最良の場合でも 2000 マイクロ秒かかります。ダブルバッファリングやマルチバッファリングなどのソフトウェア技術は、メモリレイテンシの問題を解決できる場合があります。ただし、これらの技術は、プログラムがメモリから取得する次のデータチャンクがどこにあるかを知っている通常のアルゴリズムで使用できます。この場合、プログラムは、以前に要求されたデータを処理している間にメモリに要求を送信します。ただし、プログラムがメモリから取得する次のデータチャンクを知らない場合、この技術は機能しません。言い換えると、ツリースパニングやランダムリストランキングなどの組み合わせアルゴリズムでは機能しません。さらに、マルチバッファリングでは、メモリレイテンシが一定であり、静的に隠すことができることを前提としています。ただし、実際には、メモリレイテンシはアプリケーションごとに異なります。メモリ要求のレートや共有コアの相互接続など、マイクロプロセッサの共有リソースの全体的な負荷によって異なります。
現在の実装
現在、マイクロスレッディングはCell Broadband Engineに実装されています。[1] 3~5倍のパフォーマンス向上が達成できます。現在、通常のアルゴリズムと組み合わせアルゴリズムで実証されています。他のいくつかの取り組みでは、科学的アルゴリズムでの実行可能性を証明しようとしています。
パフォーマンス
マイクロスレッドは、マイクロプロセッサの実行時使用率に基づいてメモリ遅延を最も効果的に隠す優れたソリューションを提供します。たとえば、メモリ遅延が処理時間やコンテキスト切り替え時間に比べて非常に高い場合、マイクロスレッドを追加できます。これは、メモリから大きなデータ チャンクが要求された場合、またはメモリ ホットスポットが多数ある場合に発生します。この比率が小さい場合、実行時に導入されるマイクロスレッドの数が少なくなる可能性があります。これは、実装されたアプリケーションに関連する要因とシステムの実行時要因によって異なります。
批評
マイクロスレッドは、マルチコアおよびメニーコア プロセッサのメモリ レイテンシを隠すための有望なモデルを提供しますが、対処する必要がある重要な批判がいくつかあります。
- 特別なハードウェア サポートが必要です。マイクロスレッドを効率的にスケジュールするには、各コアに独自のローカル割り込み機能が必要です。ただし、非プリエンプティブ スケジューリング ポリシーに従う場合、組み込みの割り込み機能は必要ありません。
- 各コアにプログラマーが手動で管理する独自のローカル キャッシュがある場合に最適に機能します。
- コアあたりのマイクロスレッド数を増やすと、マイクロプロセッサの共有リソースの負荷が大幅に増加します。メモリと同期の要求が増えると、共有リソースの混雑が発生する可能性があります。ただし、この問題は、ランタイム システムがメモリ レイテンシなどのマイクロプロセッサの重要な測定値を監視することで軽減できます。また、マイクロスレッド数を減らすか、スケジュール ポリシーを変更することで、全体的な実行速度を低下させることができます。
参考文献
- ^ Ahmed, M.; R. Ammar; S. Rajasekaran (2008)、「SPENK: セル ブロードバンド エンジンに別のレベルの並列処理を追加」(pdf)、第 1 回次世代マルチコア/メニーコア技術に関する国際フォーラム、カイロ、エジプト: ACM、pp. 1–10、2009年 3 月 4 日取得
