SHMEM(Cray Researchの「共有メモリ」ライブラリ[1]から)は、低レイテンシの分散メモリスーパーコンピュータに片側RDMA並列処理インターフェースを提供する並列プログラミングライブラリのファミリです。 SHMEM の頭字語はその後リバースエンジニアリングされ、「対称階層型メモリ」を意味するようになりました。[2]その後、分散メモリ並列コンピュータ クラスターに拡張され、並列プログラミング インターフェイスとして、またはパーティション化されたグローバル アドレス空間(PGAS) システムと言語を構築するための低レベル インターフェイスとして使用されています。[3]最初の SHMEM ライブラリである「Libsma」は、1993 年に Cray Research の Richard Smith によって、CRAY T3D のプロセッサ間通信ハードウェアにアクセスするための一連の薄いインターフェイスとして作成されました。SHMEM は、Cray Research、SGI、Cray Inc.、Quadrics、HP、GSHMEM、IBM、QLogic、Mellanox、ヒューストン大学、フロリダ大学によって実装されています。また、オープンソースの OpenSHMEM もあります。[4]
SHMEMは、低遅延(サブマイクロ秒)の片方向通信の基礎を築きました。[5] CRAY T3Eで使用された後、[6]その特徴である個々のワード通信の効率を維持するために必要なマイクロ秒に近い遅延を実現できるマシンがほとんどなかったため、その人気は衰えました。人気のあるサブマイクロ秒の相互接続の出現により、SHMEMはエクサスケールコンピューティングのための超効率的でポータブルな並列通信方法の必要性に対処するために使用されてきました。[7]
SHMEM を使用して記述されたプログラムは、使用されている SHMEM ライブラリによってサポートされている、高性能ネットワークで相互に接続された複数のコンピュータで起動できます。すべてのコンピュータはプログラムのコピー ( SPMD ) を実行します。各コピーは PE (処理要素) と呼ばれます。PE は、データの読み取り ("shmem_get" 操作) や書き込み ("shmem_put" 操作) などのリモート メモリ アクセス操作を SHMEM ライブラリに要求できます。ピアツーピア操作は一方的であるため、アクションを完了するためにリモート スレッドからのアクティブな協力は必要ありません (ただし、"shmem_wait" を使用してローカル メモリの変更をポーリングすることはできます)。操作は、バイトやワードなどの短い型、または配列などの長いデータ型に対して実行できます。配列は均等にストライドされたりインデックス付けされたりすることがあります (配列の一部の要素のみが送信されます)。短いデータ型の場合、SHMEM はリモート メモリ内でもアトミック操作 ( CAS、フェッチと追加、アトミック増分など) を実行できます。また、2つの異なる同期方法があります: [4]タスク制御同期(バリアとロック)とメモリフェンシングと順序付けを強制する関数。SHMEMには、リダクション、ブロードキャスト、コレクトなど、すべてのPEによって開始される必要があるいくつかの集合操作があります。
各 PE には、一部のメモリが「対称」セグメント (または共有メモリ領域) として宣言されており、その他のメモリはプライベートです。リモート PE からの一方的な操作では、「共有」メモリのみにアクセスできます。プログラマーは、静的メモリ構造または shmalloc/shfree ルーチンを使用して、PE にまたがる対称アドレスを持つオブジェクトを作成できます。
典型的なSHMEM関数
- start_pes(N) — N個の処理要素(PE)を開始する
- _my_pe() — SHMEM に現在のスレッドの PE 識別子を返すように要求します。
- shmem_barrier_all() — すべてのPEがバリアに到達するまで待機し、その後さらに先へ進むことができるようにします。
- shmem_put(target, source, length, pe) — ローカル アドレス "source" から、長さ "length" のデータを ID "pe" の PE 上のリモート アドレス "target" に書き込みます。
- shmem_get(target, source, length, pe) — ID「pe」のPE上のリモートアドレス「source」から長さ「length」のデータを読み取り、ローカルアドレス「target」に値を保存して読み取る[8]
SHMEM実装のリスト
- クレイリサーチ:クレイT3D、クレイT3E、クレイリサーチPVPスーパーコンピュータ用のオリジナルSHMEM [9]
- SGI: InfiniBand ネットワーク アダプタを搭載したNUMAlinkおよび Altix ビルドのシステム向け SGI-SHMEM
- Cray Inc.: Unicos MP (X1E スーパーコンピュータ) 用 MP-SHMEM
- Cray Inc.: Unicos LC (Cray XT3、XT4、XT5) 用 LC-SHMEM
- Quadrics: QsNetインターコネクトを備えたLinuxクラスタ用のQ-SHMEM [ 10] [9]
- サイクロプス64SHMEM
- HPSHMEM [9]
- IBM SHMEM [9]
- GPSHMEM [9]
OpenSHMEM実装
OpenSHMEM は、SGI と Open Source Software Solutions, Inc. による標準的な取り組みです。
- ヒューストン大学:OpenSHMEMを参照[4] [9]
- メラノックススケーラブルSHMEM [9]
- Portals-SHMEM ( Portals インターフェースの上部)
- フロリダ大学:ゲイターSHMEM [9]
- Open MPIにはOpenSHMEMの実装が含まれている[11]
- アダプテバエピファニーコプロセッサ[12]
- Sandia OpenSHMEM(SOS)は複数のネットワークAPIをサポートしています[13]
デメリット
最初の数年間、SHMEMは特別なネットワークを備えた一部のCray Researchマシン(後にSGIでも追加)[1]でのみアクセス可能で、ライブラリの普及が制限され、ベンダーロックインとなっていました(たとえば、Cray ResearchはMPIプログラムを部分的に書き直してMPIとshmem呼び出しの両方を組み合わせることを推奨しましたが、これによりプログラムは他のクリアMPI環境に移植できなくなります)。
SHMEMは標準として定義されていなかったため[9] [1]、他のベンダーによってSHMEMライブラリの互換性のないバリアントがいくつか作成されました。ライブラリには異なるインクルードファイル名、PEを起動したり現在のPE IDを取得するための異なる管理関数名があり[9]、一部の関数は変更されたりサポートされなかったりしました。
いくつかのSHMEMルーチンはCray T3Dアーキテクチャの制限に従って設計されており、例えばリダクションやブロードキャストはサイズが2の累乗であるPEのサブセットでのみ開始できる。[2] [9]
SHMEM ライブラリのバリアントは、クラスターにRDMAに最適化されたイーサネットしかない場合でも、任意の MPI ライブラリ上で実行できますが、パフォーマンスは通常、他の拡張ネットワーク プロトコルよりも低下します。
共有領域内のメモリは、システムのmallocではなく、特別な関数( shmalloc / shfree )を使用して割り当てる必要があります。[9]
SHMEMはCとFortranでのみ利用可能です(一部のバージョンではC++でも利用可能です)。[9]
SHMEMの多くの欠点は、エクサスケール開発によって推進された、一般的なサブマイクロ秒インターコネクト上でOpenSHMEMを使用することで克服されました。[7]
参照
- メッセージ パッシング インターフェース(特に MPI-2 の片側操作)
- アクティブメッセージ
- 統合並列 C (PGAS 言語の 1 つ、SHMEM 上に実装可能)
参考文献
- ^ abc Cray Research (1999). Cray T3E C および C++ 最適化ガイド(PDF) (技術レポート). pp. 45–83. 004-2178-002. 2014-02-01 にオリジナル(PDF)からアーカイブ。
- ^ ab 並列コンピューティング入門 - 3.11 関連作業 // cse590o コース、ワシントン大学、2002 年冬、154 ページ
- ^ 「並列プログラミングのための新しいアクセラレーション」(PDF)。Mellanox。2012年。 2014年1月18日閲覧。SHMEM
はPGAS実装の低レベルインターフェースとして使用/提案されています
。 - ^ abc Poole, Stephen (2011). 「OpenSHMEM -統一された RMA モデルに向けて」。並列コンピューティング百科事典。pp. 1379–1391。doi :10.1007/978-0-387-09766-4_490。ISBN 978-0-387-09765-7。
- ^ SHMEM アプリケーションのベンチマーク、トレース、シミュレーションのためのツール // CUG 2012、サンディエゴ スーパーコンピュータ センターと ORNL による論文
- ^ 並列仮想マシンとメッセージ パッシングの最近の進歩...、第 11 巻、59 ページ: 「プログラミング パラダイムとしての片側通信は、当初 Cray T3D および T3E の SHMEM ライブラリによって普及しました...」
- ^ ab "OpenSHMEM 2015". www.csm.ornl.gov . 2017年4月10日閲覧。
- ^ SGI TPL. 「man shmem_get」。2014年2月1日時点のオリジナルよりアーカイブ。
- ^ abcdefghijklm Nanjegowda, Ram; Pophale, Swaroop; Curtis, Tony (2012). 「OpenSHMEM チュートリアル」(PDF)。テキサス州ヒューストン大学。2014 年 2 月 1 日のオリジナル(PDF)からアーカイブ。
- ^ Shmem プログラミングマニュアル // Quadrics、2000-2001
- ^ オープンMPI
- ^ James Ross および David Richie。Adapteva Epiphany コプロセッサ用の OpenSHMEM 実装。OpenSHMEM および関連テクノロジに関する第 3 回ワークショップ 「OpenSHMEM 2016」の議事録。www.csm.ornl.gov。. シュプリンガー、2016年。
- ^ Github 上の Sandia OpenSHMEM (SOS)
さらに読む
- 共有メモリ アクセス (SHMEM) ルーチン // Cray Research、1995
外部リンク
- CRAY T3E での SHMEM の使用
- man intro_shmem (SGI TPL) - SHMEM プログラミング モデルの紹介
- OpenSHMEM: パーティション化されたグローバル アドレス空間での並列プログラミング用の標準化された API の仕様を作成する取り組み。
