インテル® Xeon Phi™ プロセッサーのクラスターモード・プログラミング (メモリーモードとの相互作用) 要約
この記事は、inside HPC に公開されている「Intel Xeon Phi Cluster Mode Programming (and interactions with memory modes) in a Nutshell」の日本語参考訳です。
以前の記事 (1 と 2) では、72 コア・プロセッサーである、『インテル® Xeon Phi™ プロセッサー向けプログラミングの要約』について説明しました。この記事では、スペシャルゲスト、James Reinders(ジェイムス・レインダース)氏による クラスターモードとメモリーモードの相互作用を解説します。
James Reinders、並列プログラミング・エンスージアスト
共有メモリーのスケーリング・レベルを調整する構成
インテル® Xeon Phi™ プロセッサーは、デフォルトですべてのプロセッサー・コアに MCDRAM を含むすべてのメモリーへの平等なアクセスを提供します。これはすべてのコア (最大 72 個) が共有メモリーにアクセスするプログラムには最適です。しかし、現実的には 36 や 18 コアまでしか共有メモリーへのアクセスがスケールしないアプリケーションもあります。インテル® Xeon Phi™ プロセッサーのアーキテクトは、そのような特性のプログラムの利点を生かせるようにクラスターモードを導入しました。この場合、後述する SNC-2 または SNC-4 モードを使用します。また、なぜ NUMA ではなく SNC (Sub-NUMA Cluster) と呼ばれるかも説明します。
一般にクラスター・アプリケーションは、多数のプロセッサー (ノード) 全体にスケールするよう MPI と共有メモリー・プログラミング・モデル (OpenMP* やインテル® TBB) を使用します。このようなアプリケーションは、単一プロセッサー上で 2、4 またはそれ以上の MPI ランクを実行する傾向があります。プロセッサーをクラスターモード設定すると、そのようなアプリケーションの動作の利点を引き出すことが可能になります。これは、2 分割 (へミスファー) または 4 分割 (クアドラント) 間でわずかなメモリー共有を持つ属性向けに明確に最適化できます。例えば、プロセッサー上の 4 つの MPI ランクで実行されるアプリケーションは、メモリーとキャッシュ・アクセスを 4 分割に最適化できることを意味します。このような最適化は、プロセッサー上のコアを相互に接続するメッシュ間のトラフィックを軽減し、競合とレイテンシーを減少させます。その結果アプリケーションのパフォーマンスが向上します。クラスターモードは特に MPI を使用する必要はありませんが、SNC クラスターモードの最適化の動作に関連します。
クラスターモードの選択はパフォーマンスに影響するだけで、アプリケーションの動作を変えるものではありません。プロセッサー上のそれぞれのコア/スレッドは、常にすべてのメモリーとキャッシュにアクセスでき、コヒーレンシーが保たれます。
混乱を避けるため: すべてのモードについて考えません
インテルは、ほとんどのシステムでは使用されないであろう、いくつかのモードを提供しています。最初に “使用されそうにない” モードは、全体全 (All to All) と呼ばれます。このモードは、システムに DDR が対称的に装着されていないシステムをサポートするため用意されています。そのようなシステムを組み上げることはできますが、想定されるシナリオは、電源投入時に DDR がテストに失敗しても継続してプロセッサーを起動してデバッグを可能にする場合です。その他すべてのクラスターモードは、対照的に装着される DDR を想定して実装されています。クラスターモードについて考える際、全体全は無視してもかまいません。次に “使用されそうにない” モードは、2 分割 (へミスファー) と呼ばれます。すべてのアプリケーションにおいて、4 分割の方が適切と思われるため、私はこのモードを “使用されそうにない” と思っています。2 分割 (へミスファー) は、次のセクションで述べる サブ NUMA モード (SNC-2) よりは興味深いかもしれません。
私は、最も適したクラスターモードを知るには 3 つの質問に答えることだと思っています。この意思決定木をまとめた図を示します。
意思決定木による答えにかかわらず、デフォルトの 4 分割や 2 分割クラスターモードは役に立ちます。(DRAM チップの問題により) マシンがそのモードをサポートできない場合、BIOS は全体全モードに強制設定します。特定の状況では、SNC モードでスピードアップを達成できるかもしれません。しかし、デフォルトのクラスターモードで実行しても悪いことはありません。
サブ NUMA クラスターモード (SNC)
クラスターモードに関する考察は、”デフォルトの 4 分割モードよりも SNC-2 や SNC-4 から利点を得られるか?” という点に行きつくでしょう。それは実にシンプルです。プロセッサー上に割り当てる MPI ランク数に応じて、SNC-2 と 4 分割、または SNC-4 と 4 分割の設定をテストするだけで済みます。
閑話: 72 は 4 分割できるが 68 はできない
一見すると数学的な間違い? と思われるかもしれません。実際には、72 は 8 分割できるが 68 はできない、としたほうが良かったかもしれません。ここで意図したかったことは、インテル® Xeon Phi™ プロセッサーのコアはタイルと呼ばれる 2 つのコアのペアで構成され、それらは切り離すことができないということです (それらは L2 キャッシュとメッシュへの接続を共有)。プロセッサーを 2 分割または 4 分割すると、ペアのコア (タイル) は実際に半分にまたは 4 つに分割されます。72 コアは 36 タイルで、それらは 18 タイル x 2 または 9 タイル x 4 に分割されます。しかし、68 コアは 34 タイルで構成されるため、2 分割では 17 タイル x 2 に分割できますが、4 分割では 8 タイル x 2 と 9 タイル x 2 の不均等に分割されます。
これこそ、4 分割するより 2 分割の方が良いという理由です。72 コアのデバイスでランク数が 4 で割り切れる場合、2 分割に最適化されたモードよりも 4 分割してバランスを取り高いパフォーマンスを得るべきです。しかし 68 コアのデバイスでは、4 分割ではバランスが取れないため、コア数を 2 で割ってバランスを取ります。つまり、68 コアのプロセッサーでは、2 分割がより適しているということです。
サブ NUMA クラスターモード (SNC)
MCDRAM と DDR の両方を持つ一般的な構成で、MCDRAM をキャッシュモード以外のメモリーモードで使用する場合、インテル® Xeon Phi™ プロセッサーは NUMA プロセッサーです。そのため、プロセッサーを “SNC” モードで 4 分割または 2 分割に細分化するのを、SNC モードを使用する前に NUMA モードであるかもしれないことを示すため、アーキテクトは “サブ NUMA” モードと名付けました。
私はクラスターモードについて考える時、NUMA を含む MCDRAM/DDR を意識的に無視していました。プロセッサーを NUMA モードにするかどうかの問題として、デフォルトの 4 分割クラスターモードに対して SNC-2/SNC-4 を考えます。もちろん、技術的には正しくありませんが、私は納得しています。非 SNC モードでは、MCDRAM と DDR へのレイテンシーは一定ですが、SNC モードでは “near MCDRAM” 対 “far MCDRAM” および “near DDR” 対 “far DDR” と一定ではありません。”near” 領域はレイテンシーが低く、”far” 領域は長いレイテンシーが課せられます。選択されたクラスターモードに対し適切なランク数を持つ MPI プログラムでは、データの “最初のタッチ (first touch)” が、正常に実行される MPI ランクからのデータである限り、すべてのアプリケーションのアクセスは “near” となります。MPI ライブラリーは、受信と送信が同じプロセッサー上で行われ、転送に far メモリーアクセスを使用する共有メモリーで発生するメッセージパッシングを最適化します。タイミングの違いはわずかであり、大量のメモリーがアクセスされる場合にのみ、その差が観察されます。
SNC モードでの MCDRAM と DDR
SNC モードで MCDRAM と DDR の機能性が変わることはありませんが、レイテンシーは、BIOS とその後に起動されるオペレーティング・システム、およびライブラリーのビューの変化による NUMA ノードへの割り当て方法で変わります。
マルチプロセッサーのインテル® Xeon® プロセッサー・ベースのマシンや、その他の現代のマルチプロセッサー・マシン上の NUMA 違いは、NUMA を扱った経験のある人々にはなじみ深いものです。インテル® Xeon Phi™ プロセッサー上の NUMA のペナルティーは、分割されたコアとキャッシュが同一パッケージ上にあるため、マルチプロセッサー・システムより少なくなります。
SNC-2 モードでは、MCDRAM の半分と DDR の半分がそれぞれの 2 分割からは、”near” または “far” となります。SNC-4 モードでは、MCDRAM や DDR の 3/4 は特定の 4 分割から “far” となります。これは、適切な MPI アプリケーションの用法に一致するため、near/far から得られるパフォーマンスは悪影響がないでしょう。
SNC-2 や SNC-4 によるパフォーマンスの利点は、コアから L2 キャッシュへの潜在的なヒット、そして必要であればメモリーへと、より短い経路から得られます。これらの “トランザクション” の経路は、2 分割 (SNC-2) または 4 分割 (SNC-4) 内で行われ、通常の “near” アクセスでは短く、”far” アクセスでは常に長くなります。この不均一性が、多くのプロセッサーコアを持つすべてのシステムで見られる “NUMA” の影響です。インテル® Xeon Phi™ プロセッサーのアーキテクトは、アプリケーションに合わせることを可能にするモードの選択を用意してくれました。
まとめ
インテル® Xeon Phi™ プロセッサーは、最大 72 個のコアと構成可能な高帯域幅の MCDRAM を搭載しています。共有メモリーを使用して 72 個のコアすべてにスケールするアプリケーション向けにのみ最大のパフォーマンスを提供するよりも、プロセッサーが共有メモリー・コンポーネントを 2 分割または 4 分割した共有メモリーにスケールするアプリケーションに最適化できるように構成し、それらを MPI によって相互に接続します。この分割は、アプリケーション・コードを変更することなく、パフォーマンスの利点を提供します。これは、アプリケーションにマシンの構成を合わせるだけで達成されます。
MCDRAM は、キャッシュ、高帯域幅メモリーそして、それらの組み合わせとして利用できます。しかし、クラスターモードでは、共有メモリーを 2 分割または 4 分割の動作に焦点を合わせるアプリケーションの動作を反映し、非常に論理的な方法で分割されます。繰り返しますが、この機能はアプリケーションの要求に合わせて、マシン構成を設定することを可能にします。最適な設定を見つけるのは、いくつかの設定を変え、リブートしてアプリケーションを再実行する、という簡単な操作で行えます。この手順は、どのオペレーティング・システム下でも適用されます。すべての構成において、インテル® Xeon Phi™ プロセッサーは、コア/スレッドおよびすべてのメモリー/キャッシュ間に対し、完全にコヒーレントなマシンであり続けます。
これまで、『インテル® Xeon Phi™ プロセッサー向けプログラミング要約』でインテルの 72 コア・プロセッサーとその概要を説明し、『インテル® Xeon Phi™ プロセッサーのメモリーモード・プログラミング (MCDRAM) 要約』でメモリーモードに触れ、この記事でクラスターモードについてカバーしてきました。次の記事では、インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) のベクトル化機能の重要性について説明します。インテル® AVX-512 は、インテル® Xeon Phi™ プロセッサー固有のものではなく、最初に登場したプロセッサーというだけです。インテル® Xeon Phi™ プロセッサーの最大 288 スレッドとインテル® AVX-512 の 16 個のベクトル要素により、それらを同時に使用することで 4608 ウェイ (288 x 16 = 4608) の並列性を可能にします。スレッドとベクトルの並列処理を組み合わせて、初めてこの超並列処理能力がもたらされます。したがって、インテル® AVX-512 は非常に重要であることが理解できます。
![]() |
![]() |
すべての図表は、lotsodcores.com の承認の下、『インテル® Xeon Phi™ コプロセッサー・ハイパフォーマンス・プログラミング – Knights Landing エディション』の書籍から抜粋されています。 |
関連記事