並列マルチコア アーキテクチャの基礎知識

分類

Flynn分類法によると

Flynnこの分類法は、命令ストリームとデータ ストリームの数に基づいて並列コンピューターの分類を定義します。

データストリームの数
1つ 多くの
命令ストリームの数 1つ SISD SIMD
多くの MISD MIMD

SISD: 単一の命令ストリームと単一のデータ ストリーム。古代の建築。

SIMD: 単一の命令ストリームと複数のデータ ストリーム。一般的にはなどGPUです。Intel MMX/SSEAMD 3DNow!

MISD: 複数の命令ストリームと単一のデータ ストリーム。適用するのが難しいiWarp

MIMD: 複数の命令ストリームと複数のデータ ストリーム。

MIMD コンピュータの分類

プロセッサの数に応じて、共有メモリ プロセッサは次の 2 つのカテゴリに分類されますSMP/UMADSM/NUMA

SMP/UMA: 共有メモリ マルチプロセッサ、集中型共有メモリ マルチプロセッサ、または一貫したメモリ アクセス マルチプロセッサ (通常、コア数は 8 を超えません)。共有キャッシュとメインメモリ。

DSM/NUMA: マルチプロセッサは、分散共有メモリと呼ばれる物理的に分散されたメモリを使用し、不均一メモリ アクセスとも呼ばれます。

並列プログラミング

基本的に、アルゴリズムまたはコードを並列実行すると、シリアル アルゴリズムまたはコードよりも実行時間が短縮されることが期待されます。並列プログラムの実行時間を分析するための便利なツールは、次の法則ですAmdahl

並列プログラミングモデル

共有ストレージとメッセージング モデル。

共有メモリ モデル: 実行中のさまざまなスレッドまたは並列タスクはメモリ内の任意の場所にアクセスでき、メモリの場所の書き込みと読み取りによって暗黙的に相互に通信できます (同じプロセスに属する複数のスレッド間の共有アドレス空間と同様)。

メッセージ パッシング モデル: スレッドには独自のローカル メモリがあり、あるスレッドが別のスレッドのメモリにアクセスすることはできません。スレッドがデータを交換するときは、データ値を含むメッセージを明示的に渡すことによって相互に通信する必要があります (アドレス空間を互いに共有しない複数のプロセスと同様)。

機種比較

共有ストレージモデル メッセージパッシングモデル
通信 暗黙 明示的なメッセージ
同期する 明示的な 暗黙のメッセージ
ハードウェアサポート 通常必要です 不要
プログラミングの取り組み より低い より高い
ワークロードのチューニング より高い より低い
通信粒度 より薄く 厚い

共有メモリには通常、特殊なハードウェア サポートが必要ですが、同様のマルチコア プロセッサでは、最終レベルのキャッシュがプロセッサ コア間で共有されている場合があります。ただし、マルチノードの場合。各ノードには独自のプロセッサとメモリがあり、ノードは相互接続されて共有ストレージ システムを形成します。このとき、イメージを実装するにはハードウェア サポートが必要です。つまり、すべてのノードのメモリがアドレス指定可能な単一のプロセッサを形成します。すべてのプロセッサによって。
プロセッサの数が多くなると、共有メモリの抽象化を低コストで実装することが困難になります。

その他のプログラミング モデル:

  • パーティション化されたグローバル アドレス空間PGAS: すべてのスレッドが単一のアドレス空間を透過的に共有できるようにします。
  • データ並列プログラミング モデル: に類似SIMD
  • MapReduce: 集まる
  • トランザクション メモリTM: コードの一部をトランザクションとして定義します。

共有ストレージ並列モデル

たとえば、共有メモリ プログラミングをサポートし、プログラマがサポートされるコンパイラへの並列処理OpenMPを表現するために使用できる一連のコンパイラ ディレクティブで構成されるアプリケーション プログラミング インターフェイスを考えてみましょうOpenMPコンパイラは、命令をライブラリ関数を呼び出すコード、またはプログラムの実行時の動作に影響を与える環境変数を読み取るコードに置き換えます。

OpenMP官网OpenMP公式サイトリンク

設計の本来の目的は、コンピュータを直列部分の1つのスレッド(メインスレッド)で実行する実行モデルを用いて、OpenMPループ構造でDOALL並列性を表現することでした。fork-join並列セグメントに遭遇すると、メインスレッドは並列セグメントの終わりまで一緒に実行する子スレッドを生成し、子スレッドはメインスレッドにマージされます。

一般的な使用

#pragma omp directive-name [clause[[,] clause] ... ] new-line
// when for is the directive-name, what clause? 
// private(variable-list)
// firstprivate(variable-list) 
// lastprivate(variable-list)
// reduction(operator: variable-list)
// ordered
// schedule(kind[, chunk_size])
// nowait

平行セグメントを表すには#pragma omp parallel

#pragma omp parallel 
{
    
     // begin
	// parallel content
} // end

LDS の並列プログラミング

TMトランザクション メモリを使用すると、次のように各操作をトランザクションにカプセル化するLDSことで、並列プログラミングをある程度簡素化できます。TMLDS

atomic{
    
    Insert(...)}  // insert a factor

atomic{
    
    Delete(...)}  // delete a factor

ストレージ階層

ストレージ構造の理由: プロセッサ速度とメインメモリ速度のバランス

キャッシュの一貫性と同期プリミティブ

並列プログラムが正しく効率的に実行されるようにするために、共有メモリ マルチプロセッサ システムは、キャッシュ コヒーレンス、ストレージ コヒーレンス、および同期プリミティブに対するハードウェア サポートを提供する必要があります。

キャッシュの一貫性の基本

図に示すように、

バスベースのマルチプロセッサのキャッシュ コヒーレンス問題

キャッシュへの書き込みコヒーレンス プロトコルの欠点: キャッシュ ブロックへの書き込みは時間と空間の中で局所化されます。直接書き込み。各書き込みはバス書き込みをトリガーし、バス帯域幅を占有します。ライトバック キャッシュ メカニズムでは、同じキャッシュ ブロック内の 1 つ以上のワードまたはバイトが複数回書き込まれる場合、バス帯域幅を占有する必要があるのは 1 回だけです他のキャッシュを無効にします。コピーするだけでは、帯域幅はすぐに使い果たされます。


ライトバック キャッシュのMSIプロトコル: ライトスルー キャッシュと比較して、ライトバック キャッシュを使用すると、帯域幅のオーバーヘッドが大幅に削減されます (ライトバック キャッシュのステータスはダーティであり、キャッシュ ブロック内の位置が変更されたかどうかをマークするために使用されます)読み込まれていました)

各キャッシュ ブロックにはステータスが関連付けられています。

  • Modified(M): キャッシュ ブロックは有効ですが、そのデータはメイン メモリ内の元のデータと (おそらく) 異なります。
  • Shared(S): キャッシュ ブロックは有効であり、他のプロセッサによって共有されている可能性があります。また、クリーンです。つまり、キャッシュされた値はメイン メモリ内の値と同じです。この状態は、「ライトスルー」キャッシュ コヒーレンス プロトコルの状態と似ていますV
  • Invalid(I): キャッシュブロックが無効です

欠点: ブロックが 1 つのキャッシュ ブロックのみに格納されているかどうかに関係なく、MSIプロトコルは読み取りおよび書き込みシーケンス要求で 2 つのバス トランザクションをトリガーします。この欠陥は、逐次プログラムなど、ほとんどデータを共有しないプログラムのパフォーマンスに影響します。


ライトバック キャッシュMESIプロトコル:MSIこの問題を解決するために、MSEIこのプロトコルは、キャッシュ ブロックがクリーンで一意であるか、クリーンだが複数のキャッシュにコピーがあるかを区別する状態を追加します。

各キャッシュ ブロックにはステータスが関連付けられています。

  • Modified(M)
  • Exclusive(E): キャッシュ ブロックはクリーンで有効かつ一意です
  • Shared(S)
  • Invalid(I)

ダーティシェアリングによりメインメモリの帯域幅を削減できる


ライトバック キャッシュMOESIプロトコル: このプロトコルは通常、ダーティ シェアリングを可能にし、通常MESIIntel Xeon プロセッサでMOESI使用されますAMD

各キャッシュ ブロックにはステータスが関連付けられています。

  • Modified(M)
  • Exclusive(E)
  • Owned(O): キャッシュ ブロックは有効ですが、ダーティであるか、複数のコピーがある可能性があります。ただし、複数のコピーがある場合、O状態にできるのは 1 つだけで、他のコピーはすべてS状態になります。
  • Shared(S)
  • Invalid(I)

更新プロトコルに基づくライトバック キャッシュ

同期のためのハードウェアのサポート

ロック
ロックの実装タイプ:

  • TSロック
  • TTSLロック
  • LL/SCロック
  • Ticketロック
  • ABQLロック
標準 テスト&セット TTSL LL/SC チケット ABQL
競合による遅延なし 最低 より低い より低い より高い より高い
1回のロック解除操作の最大通信量 ○(1)
渋滞を待っています 高い
ストレージ ○(1) ○(1) ○(1) ○(1)
公平性を確保しますか? いいえ いいえ いいえ はい はい

バリア

バリア実装タイプ:

  • 反転誘導集中バリア
  • コンビネーションツリーバリア
  • ハードウェアバリアの実装

トランザクションメモリ

ストレージ整合性モデルとキャッシュ整合性ソリューション

ストレージ整合性モデル

キャッシュ コヒーレンス プロトコルとは別に、キャッシュ コヒーレンス プロトコルは、単一のメモリ ブロック アドレスへのアクセスをどのように順序付けるかという問題のみを解決できます。異なるアドレスへのアクセスは、キャッシュ コヒーレンス プロトコルが参照する問題ではありません。

高度なキャッシュ コヒーレンス設計

ディレクトリ整合性プロトコルSnooping

キャッシュ コヒーレンスの初期の主流実装として、これは 2 つの事実に基づいています。

  • まず、ブロードキャスト メディアとして、バスはリクエストをグローバルに可視化できます。つまり、すべてのキャッシュがどのリクエストがバス上に現れているかを同時に確認できます。
  • 第 2 に、すべての 1 次キャッシュと 2 次キャッシュは、バス上に同時に現れるリクエストを厳密に監視 (スニフ) し、対応するキャッシュ ラインの状態を独立して正確に変更します。

プロセッサの数が増えると、利用可能な相互接続ネットワーク帯域幅がブロードキャスト トラフィックによってすぐにいっぱいになってしまいます。

リスニングコンセンサスプロトコルDirectory

これは、キャッシュ コヒーレンスのもう 1 つの一般的な実装であり、2 次キャッシュに依存して 1 次キャッシュ内のキャッシュ ラインの共有を記録します。

ディレクトリ・ベースのコヒーレンス・プロトコルでは、キャッシュ・コヒーレンス・リクエストには、2次キャッシュ内のディレクトリへの最初のアクセスが必要です。ディレクトリの利点は、スニッフィングにおけるグローバル ブロードキャストがポイントツーポイント データ送信に置き換わることです。この特性は、システムに多数のコンピューティング コアがある場合に特に重要です。

相互接続ネットワークアーキテクチャ

分散オペレーティングシステム

SIMT アーキテクチャ

単一命令ストリーム マルチスレッドアーキテクチャ。一般にSMIT Single-Instruction Multiple-Threadグラフィックス プロセッサで使用されます。GPUSIMD

SMIDとの違いSMIT:

  • スレッドの観点から:SMID一般に、1 つのスレッドは 1 つの命令を処理します。この命令はベクトル化されており、通常 1 つ必要です。cycle一般SIMTに、複数のスレッドが作成され、複数の が必要です。cycle
  • 論理ユニットの観点から: 4 倍の論理ユニットが必要なSMIT場合と比較してSMID

ハードウェア アーキテクチャの観点から見ると、SIMTアーキテクチャは一般に、SIMDより高いパフォーマンスを得るためにスカラー命令をベクトル化スタイルの処理に変換します。

記事を参照:

参考書:

  • 「コンピュータアーキテクチャ: 定量的研究方法」
  • 「Linux カーネル アーキテクチャの詳細」
  • 「分散オペレーティングシステム」
  • 《マルチコアプロセッサとシステム》

おすすめ

転載: blog.csdn.net/qq_48322523/article/details/128010918