x86/x64最適化勉強会6 レポート

こんにちはサイボウズ・ラボの光成です。

今回は8月31日に開催された「x86/x64最適化勉強会6」の模様についてお伝えします。

今回の勉強会では、6月に発売された Haswell の新しい機能にかかわるものが3件、C++ によるゲーム開発の環境にかかわるもの、ARMと x86 の比較、Xeon Phi についてがそれぞれ1件ずつの発表でした。

以下、それぞれの発表内容について簡単に解説します。

Haswell 関係

私は「Haswellサーベイと有限体クラスの紹介」(動画1)を発表しました。前半は Haswell の復習として、パイプラインの改良点と、256bit 長に対応した整数演算命令 AVX2、積和演算を1命令で行う FMA、いくつかのビット演算命令や暗号用途の整数演算命令などについてサンプルコードを示しつつ紹介しました。gcc 4.8 などの新しいコンパイラでは、ソースコードを変更しなくても、オプションを変更するだけでそれらの新しい命令の一部が使われるようになってきています。

後半はペアリングという暗号に使われる要素技術の実装に Haswell で搭載された mulx を利用して高速化した話を紹介しました。この実装は、先月開催された SAC 2013 という学会での資料によると現時点では世界最速のようです。

後の2件は Haswell の TSX(Transactional Synchronization eXtension) に関わるものでした。

従来、複数の CPU が同じあるメモリを読み書きする場合、mutex などのロック機構を利用して排他制御をします。これはロックの順序を間違えるとデットロックになってしまい、デバッグが難しい問題を起こすことがあります。トランザクションメモリは、そういった問題を解決する一つの手段として提案されています。トランザクションメモリでは、メモリ読み書きの一連の処理(トランザクション)を複数の CPU がロックせずに並列に行います。そして、処理が互いに干渉してしまったなどの理由でエラーになったときのみ、トランザクション処理を中止してやり直し要求を通知する仕組みです。

Haswell の TSX では RTM(Restricted Transactional Memory) と HLE(Hardware Lock Elision) という2種類の方法が提供されています。

@shinhさんの発表「TSX」(動画2)は RTM の紹介とそれを使った実験の話でした。Haswell の RTM では xbegin, xend, xabort, xtest という命令が追加されています。 それらを利用するにはアセンブラ、intrinsic 命令、RTM に対応した pthread_mutex_lock などの方法があり、それらを使ったベンチマークを紹介されました。RTM に対応したライブラリの mutex が簡単で性能もそこそこよくてよいのではとのことです。

@starpozさん(サイボウズ・ラボ 星野さん)の発表「Intel TSX HLEを触ってみた」(動画3)は HLE に関わるものでした。Haswell の HLE としては xacquire, xrelease という命令が追加されています。 発表ではそれを用いて Spinlock を実装し、std::map や自作の Btree map のロックに使って CPU 数や read 比率などのパラメータを変えて性能がどう変わるかの実験結果を紹介されました。 わりとお手軽に性能が向上するとの感想を持たれたようです。

C++ によるゲーム開発の環境

@i_saintさんの発表は「Runtime C++ Editing」(動画4)でした。 ゲーム開発ではトライ&エラーのサイクルを速くするためにスクリプト言語がよく使われているそうです。 そして C++ でもプログラム実行中にそのソースコードを編集すると、それがリアルタイムにプログラムに反映されるのが理想だそうです。 それを実現する既存のライブラリやフレームワークはいくつかあるのですが、今回はお手軽に使えることを優先して開発されたのが「DynamicPatcher」(blog)です。obj ファイルを自力でロード&リンクし、古い関数の先頭を jmp 命令で置き換えることで実現しています。質疑応答時に map ファイルを使うアイデアが出されて、現在はそれを利用したライブラリの改良も行われているようです。

ARMとx86の比較

@tanakmuraさんの発表は「Cortex-A15 vs Jaguar」(動画5)でした。Cortex-A15 は Nexius 10 などに使われている ARM の CPU、Jaguar は AMD の x86 CPU で PlayStation 4 にも使われる予定です。 それぞれの CPU についてアーキテクチャの解説をしながら整数・浮動小数点数演算、メモリアクセスなどのベンチマークのを行いました。 アーキテクチャ的には Cortex-A15 の方が Jaguar よりも速そうなのにベンチマークをとるとそうでもないことがあります。 その理由として ARM の浮動小数演算命令に関するアドレッシングの制約や、分岐予測の制約条件(コード上で近いところに複数の分岐命令を置くと遅くなる)が考えられる、とアセンブリ出力を示しつつ話されました。

Xeon Phi 関係

@k_nitadoriさんの発表は「Xeon PhiとN体計算コーディング」(動画6)でした。 似鳥さんは理化学研究所で、天体物理学で必要な多数の粒子間の相互作用を数値解析で求めるN体計算の研究をされています。GeForce クラスタやスーパーコンピュータ京を使った論文で3度もゴードン・ベル賞を受賞されています。 今回はこの発表のために神戸から来てくださいました。 N体計算の基本的な方程式から始まって、実装方法、Xeon Phi を使った最適化、並列化の方法、同期が遅い問題点などの解説をされました。 最適化のための細かなトリックや式変形は面白そうなのが多くてじっくり見てみようと思います。

今回も活発に鋭い質疑応答が行われ、とても勉強になりました。発表者は随時募集していますのでご興味のある方は、ぜひ私のtwitterアカウント@herumiまでご連絡ください。

最後になりましたが、いつも会場と無線LANの提供、およびustreamの中継をしてくださっている(株)AXELL社のご好意に感謝いたします。