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

サイボウズ・ラボの光成です。

今回は2月17日に開催された「x86/x64最適化勉強会8」の模様についてお伝えします。 第7回からなんと約3年振りです。

今回の発表内容はAVX-512周りの話が2件、命令の正確なレイテンシの話、年明けから世間を騒がせているMeltdownとSpectreの話が2件でした。

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

AVX-512関係

私の発表は「AVX-512(フォーマット)詳解」でした。 AVX-512はまだSkylake-Xなどの一部のCPUにしか搭載されていませんが、今後徐々に採用が増えるでしょう。

(注意)21ページの「3値論理」は「3項論理」の方が適切です。

AVX-512のレジスタ構成や基本的な命令セットを説明した後、AVX2までにはなかったマスクレジスタ、静的丸めモード、ブロードキャストなどの解説をしました。 マスクレジスタは便利に使えそうです。 AVX-512のエンコーディングはxbyakを開発するときにいろいろ調べたものを紹介しました。

資料をほぼ作り終えたところで、そういえば昔@tanakmuraさんが解説されていたようなと探したらAVX-512 Advent Calendar 2014が見つかりました。 ほとんど内容がかぶってたのですがまあすいません。disp8*Nの話はあまり見たことがないのでよしとしてください。

@kaityo256さんの発表は「AVX2/AVX-512を用いたLennard-Jones系 ポテンシャルの力計算のSIMD化」でした。

分子動力学法を用いて泡のシミュレーションなどをするそうです。その際に必要なポテンシャルの計算をメモリ律速になりがちな部分をSIMDを用いていかにうまく最適化するかという話でした。 キャッシュラインを意識しつつ何度もデータレイアウトを変更したり、gather/scatterをうまく使って高速化した経過を紹介しました。 どうやったのかという工夫の話はとても参考になります。 AVX-512はコンパイラの自動最適化に任せられる部分が増えてきて楽できそうとのことです。

@slankdevさんは残念ながら体調不良でお休みでした。またの機会にお願いしたいです。

命令速度の計測

@tanakmuraさんの発表は「命令単体の性能を計測する」でした。 高速化に必要な基本的な情報として各種命令のスループットやレイテンシがあります。 公式ドキュメント、Agnerさんのドキュメントなどの情報には一長一短があって自分で計測ツールを作ったとのことです。

vmovdquの境界をまたいだときのロード時間の違いの一覧表は珍しいです。依存関係を加味したパズルチックな命令配列は面白いです。 rdtscはTurbo boostなどの影響を受けるので__NR_perf_event_openのsyscallをして測定すると楽とのことです。

Meltdown & Spectre

MeltdownとSpectreは今年初めに話題になった(対策が現在進行中の)近年の多くのプロセッサに潜在的に存在する脆弱性です。 攻撃対象のメモリの情報を、キャッシュに載ったか否かというサイドチャネル攻撃によって推測する手法です。 お二人には連続講義という形でお願いしました。

f:id:cybozuinsideout:20180219165042j:plain

@satoru_takeuchiさんは「図解でわかるSpectreとMeltdown」、 @mhiramatさんは「SpectreBustersあるいはLinuxにおけるSpectre対策」でした。

基本的に投機実行や分岐予測といったCPUの高速化機構に対する攻撃なので、その対策は速度が落ちる方法になるのが悲しいところです。 ただ速度低下は複雑な要因が絡むため各自のシステムで評価しないと分からないことも多く、マイクロベンチマークで一喜一憂しないように、とのことです。 これから登場するであろう対策されたCPUに期待です。

Bounds Check Bypass対策のArray_index_nospecや、Branch Target Injection対策のRetpolineの詳細な解説は勉強になりました。 特に後者はROP(return oriented programming)という攻撃手法を脆弱性対策に使うという逆向きなアイデアは面白いです。

FILL_RETURN_BUFFERについては、Skylakeがそこまで頑張って高速化しようとしているのになんて無慈悲なという感想です。

「完全対応はできないけどどうしましょう」という質問に対して「バッファオーバーフローと同じでプログラマが原理を理解して一つずつ対応していくしかない」という答えになるほどと思いました。

LT

@yottuiさんは「AVX512自動ベクトル化」の話でした。gccやclangは結構頑張ってベクトル化してくれるけどVisual Studioはあんまりしてくれません。ただsin関数はVSの方がベクトル化してたのこと。Intelコンパイラも超越関数のSIMD版を持っています。

@makoto_katoさんはARMv8 Cryptography Extension & Performanceの発表でした。 ARMv8には暗号用専用命令が搭載されていて、それを利用するとSHA2ではCorex-A53(1.2GHz)がCore i7-7700のソフトウェア実装より速いので是非みなさん使いましょうとのことです。 SHA2用命令はIntelならGoldmontに搭載されています。

@shinhさんはTensorFlow XLAの話でした。 TensorFlowは機械学習フレームワークでPythonでコードを書くと依存グラフを生成し、XLAでコンパイルして並列実行するという仕組みです。 ただ計算時間の大半をmatmul(行列演算)が占めるので今のところ効果は小さいかなという発表でした。

@ksmakotoさんは、@xoreaxeaxeaxさんが作ったmovfuscatorというCプログラムをmov命令のみにコンパイルするツールを紹介しました。Stephen Dolanさんがmov命令がチューリング完全だよという論文(mov is Turing-complete)を出したところ、それをまじめに?実装してみたというものです。 少し前に話題になったのですがDOOMというゲームを1フレーム描画するのに7時間かかるそうでいろいろ「頭おかしい」です。

動画と懇親会

今回の勉強会はProject92@makotokogaさんがビデオ中継と配信をしてくださいました。 youtubeでごらんいただけます。

会場の隅から斜めに撮られたスクリーン画像をリアルタイムで台形補正したり、発表者とプレゼン資料が同時に表示されたりといった機能に驚きました。配信中も細かく調整されていて素晴らしかったです。

懇親会はさくらインターネット社がフードスポンサーになってくださいました。

どうもありがとうございました。

f:id:cybozuinsideout:20180219165051j:plain

まとめ

今回はMeltdownとSpectreという旬の話題を扱ったせいもあるのか80人を超える参加者で大盛況でした。 活発な討論もよかったです。もちろん発表者の方々にも感謝です。 今度はそんなに空けずに開催したいものですね。