MICアーキテクチャでの複素数計算について

出典: トータル・ディスクロージャ・サイト(事実をありのままに)

TOP500で1位を獲得したり、最近のHPC業界の話題に事欠かないXeon Phi。そんなXeon Phiを使ったプログラミングについて、ちょっとした問題点を発見した。

複素数計算とSSE3

CやFortranといったプログラミング言語では、複素数は実部と虚部をそれぞれ実数型とみなして1つずつ並べたデータとして表現される。これを配列にすると、実部と虚部が交互に並ぶメモリ配置となる。この複素数配列をベクトル計算しようとすると、実部と虚部をどのようにベクトルレジスタに読み込んでいくか、という問題が出てくる。

これに対する一つの答えが、SSE3であった。SSE3で追加されたベクトル命令には、

MOVSLDUP/MOVSHDUP
単精度実数の組としてメモリに配置された複素数を128ビットのベクトルレジスタに読み込む際には、基本的には64ビットの複素数2個として格納されるものである。一方このMOVSLDUPは、下位の64ビットの実部を下位64ビットにブロードキャストし、上位の64ビットについても同様に上位64ビットにブロードキャストする。MOVSHDUPは同様に虚部をそれぞれブロードキャストする。複素数同士の乗算では、実部と実部、実部と虚部、虚部と実部、虚部と虚部の4回の実数乗算が必要なため、片方の複素数の実部と虚部をそれぞれブロードキャストしてベクトル乗算を行うと、都合良く計算ができるのである。
MOVDDUP
倍精度実数の64ビットを、128ビットのベクトルレジスタにブロードキャストする。複素数の実部に対してこの命令でメモリを読み込むと実部がベクトルレジスタの2要素へとブロードキャストされ、虚部に対して実行しても同様の結果となるため、単精度で上記2命令を必要としたブロードキャストは、倍精度においてはこの1命令で用を満たせる。
ADDSUBPS/ADDSUBPD
ベクトルレジスタで隣り合った2つの要素について、下位ビット側の要素は減算を、上位ビット側の要素は加算を行うベクトル命令。下位に実部、上位に虚部が格納されているレジスタに、上述の方法でブロードキャストした実部をベクトル乗算すると、計算結果として下位に実部×実部、上位に虚部×実部が格納され、一方このレジスタをシャッフルして、下位に虚部、上位に実部としたレジスタに、ブロードキャストした虚部をベクトル乗算すると、下位に虚部×虚部、上位に実部×虚部が格納される。この2つの計算結果をADDSUBPS/ADDUSBPDでベクトル演算すると、下位に実部×実部-虚部×虚部、上位に実部×虚部+虚部×実部が格納され、すなわちそのまま複素数の乗算の結果として使える配置となる。

というものがあり、これらを使いこなすことで、複素数のベクトル計算を効率的に行うことができるようになった。

これらの命令はAVXにも仕様を256ビット化された形で継承され、さらにAVX2においてはベクトル乗算の後に減算と加算を交互に行うFMA命令が追加され、複素数計算のさらなる性能向上を助けていた。

MICアーキテクチャの命令セット

ところがMICアーキテクチャでは、これらに相当する命令は実装されなかった。Intel CompilerでXeon Phi向けに複素数の乗算をコンパイルすると、

  1. 素直にベクトル乗算を行い、実部×実部と虚部×虚部を計算して、レジスタAに格納する。
  2. 片方の要素をシャッフルしてベクトル乗算を行い、実部×虚部と虚部×実部を計算して、レジスタBに格納する。
  3. レジスタAとレジスタAのシャッフルとでベクトル減算を行い、レジスタCの下位ビットに実部×実部-虚部×虚部が格納される形とする。
  4. レジスタBとレジスタBのシャッフルとでベクトル加算を行い、レジスタCの下位ビットをマスクして実部×虚部+虚部×実部だけを上位ビットに格納する。

というアセンブリができあがる。減算と加算では演算器の半分が遊んでいる上、FMA命令も使われずに命令の数も増えている、そんなプログラムである。

実部と虚部を別の配列にしたり、アセンブリ命令を丁寧に使ってプログラミングを行えば、それでも効率的な計算はできるのであるが、従来問題無く効率的なベクトル計算ができていたプログラムは、そのままでは性能を発揮できないものとなってしまっていた。今後のアーキテクチャやコンパイラの改良で、きちんと複素数計算でも実力を発揮するような環境がいずれ完成するのであろうが、現行の環境で複素数を用いたHPC計算を行う際には、この点に注意して開発を行いたい。


この記事へのコメントをお寄せください

  • サイトへの書き込みに差し支えございましたら トータルディスクロージャーサイトサポート係へメールをお送りください
  • トータル・ディスクロージャ・サイトに投稿された文章と画像は、すべてその著作権がHPCシステムズ株式会社に帰属し、HPCシステムズ株式会社が著作権を所有することに同意してください。
  • あなたの文章が他人によって自由に編集、配布されることを望まない場合は、投稿を控えてください。
  • コメントを書き込む場合は名前にひらがなを織り交ぜてください。
  • あなたの投稿する文章と画像はあなた自身によって書かれたものであるか、パブリック・ドメインかそれに類する自由なリソースからの複製であることを約束してください。あなたが著作権を保持していない作品を許諾なしに投稿してはいけません!

<comments hideform="false" />


Comments

ノート:MICアーキテクチャでの複素数計算について

個人用ツール