インテル® Xeon Phi™ プロセッサー向けのコードの現代化
この記事は、インテルの The Parallel Universe Magazine 26 号に収録されている、新しいインテル® Parallel Studio XE 2017 の機能を利用したインテル® Xeon Phi™ プロセッサー向けのコードを現代化に関する章を抜粋翻訳したものです。
未来はここにあります。少なくとも、インテルの次世代のハードウェアについては、そう言えるでしょう。ハードウェア・アクセラレーターは長年、ハイパフォーマンス・コンピューティングにおける次なる目玉ともてはやされ、多くのベンダーが製品とサービスを提供してきました。しかし、アクセラレーターを最大限に活用するためのプログラミング・モデルは、習得が困難で、プログラマーは独自のコードに縛られがちです。
新しいインテル® Xeon Phi™ プロセッサー (開発コード名: Knights Landing または KNL) は、この問題を軽減し、標準の CPU 機能を利用してアクセラレーターのパフォーマンスを引き出す、インテル初のプロセッサーです。インテル® Xeon Phi™ プロセッサーは、明示的なプログラムによる制御やコードのオフロードを必要としません。そのため、OpenMP* を使用しているかどうかに関係なく、プログラムをシームレスに実行できます。コードの現代化と複数レベルでのスケーラブルな並列パフォーマンスの実現を支援するため、インテル® Parallel Studio XE 2017 スイートには、強力な各種開発ツールが含まれています。
さらに、インテル® Xeon Phi™ プロセッサーはインテル® Xeon® プロセッサーとバイナリー互換であるため、現在 x86 アーキテクチャーで実行しているワークロードを、インテル® Xeon Phi™ プロセッサーの高度な並列処理向けにチューニングおよび最適化できます。
コードの現代化について
インテル® Xeon Phi™ プロセッサーは、8 つの倍精度浮動小数点数または 16 の単精度浮動小数点数を 512 ビット・ベクトルにパックできる、インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) をサポートします。一般に、512 ビット・ベクトル拡張は、インテル® AVX およびインテル® AVX2 命令よりも幅広い機能と高いパフォーマンスを提供します。ベクトルを効率良くパックし、無駄を最小限に抑えることは、言うのは簡単ですが、実行するのは困難です。ベクトル命令に加えて、ランタイム環境ではいくつかのスレッドを利用して、異なるレベルの並列処理が可能です。そのため、より複雑になります。コードの現代化の設計では、異なるレベルの並列処理を考慮する必要があります。
- ベクトル並列処理: コア内で、異なるデータチャンクに対して同じ計算が実行されます。SIMD (Single Instruction, Multiple Data) ベクトル化と呼ばれます。SIMD ベクトル化を効率良く利用することで、コードのシリアル領域とスレッド並列領域の両方で利点が得られます。
- スレッド並列処理: 複数のスレッドが共有メモリーを介してやり取りし、協調して与えられたタスクを実行します。
最新の OpenMP* 標準 (4.0 以降) では、明示的な SIMD ベクトル化とスレッド並列処理の両方を C/C++ および Fortran コードに追加可能な構造が用意されています。インテル® コンパイラーは、OpenMP* をサポートしています。
適切に利用することで、SIMD ベクトル化とスレッド化は、大幅なスピードアップをもたらします。図 1 は、最新のインテル® Xeon® プロセッサー上で、シリアルコードと比較して 179 倍のスピードアップを示しています。インテル® Xeon Phi™ プロセッサーでも同様のパフォーマンスの向上が想定されます。
インテル® Parallel Studio XE とコードの現代化プロセス
コードの現代化の最適化フレームワークについては、アプリケーション・パフォーマンスを向上する体系的なアプローチとしてこちらで詳しく説明されています。このフレームワークは、インテル® Xeon Phi™ プロセッサーにも適用可能で、それぞれの最適化ステージで繰り返しアプリケーション・パフォーマンスを向上します。
- 現在のコードとワークロードのプロファイル: インテル® VTune™ Amplifier XE で hotspot を検出し、インテル® Advisor でベクトル化とスレッド化の可能性とヘッドルームを特定します。インテル® コンパイラーは最適なコードを生成し、インテル® マス・カーネル・ライブラリー (インテル® MKL)、インテル® スレッディング・ビルディング・ブロック (インテル® TBB)、インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) などの最適化されたライブラリーを適用します。
- スカラーコードの最適化: 正しい精度のデータ型で、適切な関数を使用し、コンパイル時に精度に関するコンパイラー・オプションを設定していることを確認します。
- 明示的な SIMD ベクトル化: OpenMP* ベースの SIMD ベクトル化機能とデータレイアウトの最適化を併用します。適切なデータ構造を定義し、SIMD Data Layout Template (Parallel Universe 24 号を参照) を使用して C++ コードを構造体配列 (AOS) から配列構造体 (SOA) に変換します。
- スレッド並列処理: OpenMP* と環境変数を利用して、コアに対し適切なスレッド・アフィニティーを設定します。インテル® Inspector でデバッグし、スケーリングの問題を引き起こすスレッドエラーがないことを確認します。スケーリングの問題は通常、スレッドの同期や非効率なメモリー使用により生じます。