インテル® Xeon Phi™ プロセッサー向けプログラミング要約
この記事は、inside HPC に公開されている「Intel Xeon Phi Processor Programming in a Nutshell」の日本語参考訳です。
スペシャルゲスト、James Reinders(ジェイムス・レインダース)氏がプログラマーの視点からインテル® Xeon Phi™ プロセッサーを解説。
![]() |
プログラマーはインテル® Xeon Phi™ プロセッサーにどのような印象を持つでしょう? この記事では、プログラマーとして私が考えることを述べたいと思います。以降の関連記事では、プログラミング・モードや主要なアプリケーションで使用されるテクニックについて掘り下げていきたいと思います。ここではあまり詳細には踏み込まず、インテル® Xeon Phi™ プロセッサーを使用するに際してプログラマーが心がけるべきことを述べていきます。インテル® Xeon Phi™ プロセッサーの詳しい説明については、私たちの書籍『インテル® Xeon Phi™ プロセッサー・ハイパフォーマンス・プログラミング – Kights Landing Edition』 (632 ページ、英語) をお読みください (日本語翻訳版はこちら)。この記事では、書籍とサンプルコードを提供する書籍の Web サイト (英語) でカバーされている詳しい内容のニュアンスを残しながら、簡潔に概略を説明します。 |
インテル® Xeon Phi™ プロセッサーは、先端のパフォーマンスと電力効率を組み合わせ、主にスーパーコンピューターの構成要素として位置付けられます。しかし、技術的には各種サーバーや PC 向けの CPU として、x86 で動作するすべてのオペレーティング・システムを実行できます (メニーコアへの準備が整っている現代の x86 オペレーティング・システムの使用を望むなら)。
インテル® Xeon Phi™ プロセッサーの特徴
- 64 ビット機能を備えた完全な x86 互換のプロセッサーです。
- 従来の x86 プロセッサー以上のコア数を備えます。インテル® Xeon Phi™ プロセッサーは、最大 72 コアを搭載します (いくつかの製品バージョンはやや少ないコア数)。各物理コアは 4 スレッドをサポートするため、プロセッサー全体で最大 288 個の論理スレッドが提供されます。
- “Knights Landing” (開発コード名) として知られる、インテル® Xeon Phi™ 製品ファミリーの 1 つです。
互換性は単なる利点か?
インテル® Xeon Phi™ プロセッサーには 2 つの特徴があります。それは、互換性と先端のパフォーマンスです。競合他社の間では、よくどの製品のパフォーマンスが最も高く、そのパフォーマンスを引き出す容易性や困難さが論じられます。しかし、インテル社は、世界中の大部分の PC やサーバーの原動力となるアーキテクチャー (x86) との互換性というユニークな主張を行っています。
インテル® Xeon Phi™ プロセッサーのアーキテクチャー – 最大 72 個の x86 コア
パフォーマンスについてもう少し知っておきましょう
インテル® Xeon Phi™ プロセッサーについて語りたいことは沢山ありますが、プログラマーにとって重要なことは、パフォーマンスが求められる (重要である) 場合にのみ詳細を知る必要があることでしょう。もちろん、スーパーコンピューターのプログラマーはパフォーマンスを常に意識しているため、インテル® Xeon Phi™ プロセッサーについて議論する際にパフォーマンスの問題に触れないのは不自然でしょう。
ベクトル・パフォーマンス
プロセッサーは、SIMD 命令 (ベクトル命令) を利用することでデータのストリームを最も効率良く計算します。インテル社が x86 命令セットに最初に追加した SIMD 命令はインテル® MMX® 命令でした。これは 20 年も前のことです。以降 128 ビット SIMD への命令拡張が、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE)、インテル® SSE2、インテル® SSE3、インテル® SSSE3、インテル® SSE4.1 そしてインテル® SSE4.2 によって行われてきました。最近では、インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) とインテル® AVX2 命令で SIMD 幅が 256 ビットへ拡張されています。そして今、512 ビット SIMD 命令を提供するインテル® AVX-512 へと至っています。インテル® Xeon Phi™ プロセッサーは、これらすべての SIMD 形式をサポートし、最も高いパフォーマンスはインテル® AVX-512 によって達成されます。インテル® AVX-512 は、512 ビット幅のデータを一度に処理します。言い換えると、16 個の単精度浮動小数点操作、または 8 個の倍精度浮動小数点操作を同時に行えるということです。これは、インテル® AVX/インテル® AVX2 のおよそ 2 倍、各種インテル® SSE 命令セットの 4 倍の最大パフォーマンスをもたらします。
したがって、鍵となるプロセッサーのパフォーマンスは、インテル® AVX-512 命令から得られます。ベクトル化は、すべてのプロセッサーにおいて最高のパフォーマンスを発揮するために必要な最適化であると知られています。GPU とは異なり、ベクトル化の概念はマルチスレッド化の概念とは大きく異なります。これは諸刃 (両刃) の剣であるといえます。高い柔軟性を提供しますが、最適化において 2 つのことを犠牲にします。インテル® AVX-512 の高度な機能は、これまでの SIMD 命令セットよりもコンパイラーやプログラマーがベクトル化を容易に行うことを支援します。すでにベクトル化に向けて最適化されているアプリケーションは、コンパイルするだけで良い結果がもたらされることが期待されます。しかしながら、最大限のパフォーマンスが期待される場合、ベクトル化には潜在的な最適化の可能性がまだあります。書籍の 4 つの章でベクトル化のさまざまな面を説明し、実際のアプリケーション例を示しているように、ベクトル化は非常に重要です。今後の記事で、書籍の 4 つのベクトル化に関する章を要約してベクトル化について説明します。
インテル® Xeon Phi™ プロセッサーは、2 つの x86 コアからなる “タイル” で構成されます。
各タイルは 2 つのコアからアクセスされる共有 L2 キャッシュを搭載します。それぞれの
コアは 2 つのベクトル処理ユニット (VPU) を持っています。プロセッサー内のタイルは、
“CHA” (キャッシュ/ホーム・エージェント) によってほかのタイルへ接続されます。
“Lots of Cores (多くのコア)” のためのパフォーマンス – 別名 “Feed the Beast (野獣への給餌)”
私がこれまでに使用してきたマシンは、最新のものほど高速でした。それに伴い、私は新しいマシン (野獣) にどのようにエサを与えるか常に考えてきました。インテル® Xeon Phi™ プロセッサーにおいても同様のことを考えていますが、プロセッサーのアーキテクトはこれを支援するためいくつかの新機能を用意してくれました。これは、計算エンジンとの間でデータをやり取りできないと、最高のパフォーマンスを得られないためです。
私は、インテル® Xeon Phi™ プロセッサーをチップ上のシステム (特にクラスターとして) と考えています。パフォーマンスのためプロセッサー上に実装された特別な “モード” 機能を含む、すべてを考慮していると思っています。
これまでにない設定機能をサポートするインテル® Xeon Phi™ プロセッサーのクラスター設計では、重要となる 2 つの設計上の論点があります。それは、MCDRAM とクラスターモードです。これら 2 つは非常に興味深いですが、どちらか一方を学ぶとしたら MCDRAM のモードをから始めることをお勧めします。MCDRAM はプログラムの設計に影響する可能性が高いため、この説明から始めます。以降の記事で、MPI プログラマーがプログラムを実行する際にチューニングを可能にするクラスターモードについて再考します。
インテル® Xeon Phi™ プロセッサーは、”MCDRAM” と呼ばれる 16M バイトのメモリーを
パッケージ内に搭載しています。MCDRAM はキャッシュとして (事実上の L3 キャッシュ)、
高帯域幅のメモリーとして、または両方の組み合わせとして使用できます。これらは、
それぞれ “キャッシュ”、”フラット”、および “ハイブリッド” モードと呼ばれます。
MCDRAM のモード
MCDRAM は、シンプルな設計 (CPU-L1-L2-メモリー) に高いパフォーマンスをもたらす画期的な設計 (CPU-L1-L2-MCDRAM-メモリー) です。このパフォーマンスの向上は、デフォルトの MCDRAM “キャッシュ” モードで得られますが、特定の状況では注意深く “フラット” モードを使用することで良い結果を達成できます。これらの “モード” は、プロセッサーのブート時に BIOS 設定でセットできます。
MCDRAM は、高帯域幅メモリー (16M) を提供します。インテル® Xeon Phi™ プロセッサーを搭載する多くのシステム設計では、ほかにメインメモリー (DDR) を持ちます。MCDRAM は DDR ほど高速にアクセスできません。しかし、高い帯域幅を持っています。そのため、同時に大量のデータのリード/ライトを行う計算では非常に重要です。デフォルトでは MCDRAM はキャッシュとして動作するため、これは非常に適しています。しかし、”キャッシュ・フレンドリー” ではないアルゴリズムが MCDRAM を “フラット” モードで使用することで利点が得られることもあります。また、MCDRAM をキャッシュとメモリーに分割する使い方もあります。これは “ハイブリッド” モードと呼ばれます。
プログラムはまず、MCDRAM をキャッシュモードで使用してベクトル化のチューニングを行うべきです。このアドバイスが意味することは、コードがベクトル化される際にメモリー・アクセス・パターンが変わる可能性があるということです。この開発過程により、誤ったアクセス・パターンのチューニングを避けることができます。
MCDRAM を直接管理するのが最適だと思われるなら、”キャッシュ” モードと “フラット” モードの結果を比較してみます。私は、優秀な何人かのプログラマーが、”キャッシュ” モードの使用に不満を漏らす状況を見てきました。この課題の要点は、プロセッサーがキャッシュ全体を使用することです。”フラット” モードを選択した場合は、利点を得るためすべてのメモリーを使用する必要があります。アイドル状態のメモリーは、”キャッシュ” モードでの効果的な実装を容易にします。
以降の記事で、”フラット” モードのプログラミングについて詳しく触れます。”フラット” モードの MCDRAM の利点を引き出すには、ハイレベルでは 3 つの方法があります。1 つ目の方法は、numactl ユーティリティーを使用してメモリー要求を MCDRAM にマップすることです。2 つ目の方法は、メモリー要求をインターセプトして、MCDRAM へマップすることです (サイズに依存)。3 つ目の方法は、特殊なメモリー・アロケーターを使用するか、変数や割り当て時にコンパイラーの制御を使用する方法です。
それぞれの方式は十分簡素化されていますが、最後の選択肢だけがコードを変更する必要があります。高帯域幅のメモリーは、今後のシステム設計では当たり前のようになると信じています。そのため、有益なコードの変更は、インテル® Xeon Phi™ プロセッサー以降でも役立つでしょう。コードの変更方法は簡単です。C/C++ コードでは “malloc” を単純に “hbw” malloc” 呼び出しに変更し、Fortran では ALLOCATE キーワードを追加して高帯域幅メモリーを要求します。
私は、MCDRAM を直接使用するコード変更により、利点を得られる状況を見てきました。それでも、多くのプログラマーが彼らのプログラムで、”キャッシュ” モードを上手く使用するのに不満を漏らすのを見てきました。キャッシュモードの実装に関しては、アーキテクトは素晴らしい仕事をしました。どのような事情があるにしろ、ベクトル化を最初に行うべきです!
まとめ
![]() |
![]() |
すべての図表は、lotsodcores.com の承認の下、『インテル® Xeon Phi™ コプロセッサー・ハイパフォーマンス・プログラミング – Knights Landing エディション』の書籍から抜粋されています。 |
インテル® Xeon Phi™ プロセッサーは注目すべき x86 デバイスです。世界で最も強力なスーパーコンピューターの構成要素として、最大 72 個のコアを搭載し、パフォーマンスを向上する多くの設計上の特徴を備えています。プログラマーにとって、理解すべき最も重要な高いパフォーマンスを提供する機能は、ベクトル処理 (インテル® AVX-512)、MCDRAM モード、およびクラスターモードです。今後の記事では、ここで概要を説明したそれぞれの機能を掘り下げていきます。
James Reinders は、高速コンピューターとそれらを高速化するソフトウェア・ツールを好ましく思っています。James は最近、世界最速であった最初の TeraFLOPS スーパーコンピューター (ASCI Red)、コンパイラー、およびアーキテクチャーを含む多くのインテル® プロセッサーと並列システム向けの業務に携わってから、10001 日の記念日を迎えました。James は、『VTune™ Performance Analyzer Essentials』(2005)、『インテル スレッディング・ビルディング・ブロック ― マルチコア時代の C++ 並列プログラミング』(2007)、『構造化並列プログラミング』(2012)、『インテル® Xeon Phi™ コプロセッサー ハイパフォーマンス・プログラミング』(2013)、『ビジュアルエフェクト向けのマルチスレッド化』(2016)、『ハイパフォーマンス並列処理の秘訣」Volume 1 (2014) & Volume 2 (2015)、そして『インテル® Xeon Phi™ プロセッサー・プログラミング』(2016) など多くの書籍を執筆してきました。James は米国オレゴン州に在住しており、今後も並列処理に携わり各地でその教授に努めていきます。
関連記事
Part 2: インテル® Xeon Phi™ プロセッサーのメモリーモード・プログラミング (MCDRAM) 要約
Part3 : インテル® Xeon Phi™ プロセッサーのクラスターモード・プログラミング (およびメモリーモードとの相互作用) 要約
Part 4: インテル® Xeon Phi™ プロセッサーにおけるインテル® AVX-512 プログラミング要約