モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

<mini> AVX-512 (AVX 3.2+) のお話

 SIMD についてはあんまり詳しくないけど書いてみようと思う。

  Intel Advanced Vector Extensions、略して Intel AVX だけど、名前の通り、発展的 Vector 扱いって感じである。そもそも一度に 128 bit は SSE (legacy SIMD) だったけど、それも踏まえ、AVX は 128 bit SSE 互換命令 (非破壊的命令) もあるし、さらに上の 256 bit、512 bit 命令も存在する。

 SSE と AVX は混ぜて使うとコンテキスト切り替えみたいなのが生じることで、どうやら実行スループットが落ちるらしいので注意。ただ、AVX を使える環境で、SSE を使うメリットはそもそも薄いし、AVX の非破壊的フォーマットはかなりの驚異的である。

 たとえば、X = A + B、Y = A - B としたいとき、A´←A、A←A + B、A´←A´ - B みたいな命令が従来の命令では書かれるんだけど、非破壊的フォーマットができるようになって、そのままの X←A + B、Y←A - B がそのままかける。つまり move 命令 (レジスター間データ移動) が 1 つ減らせるわけです。もちろん SRAM なんで、高速であることに変わりはないが、やはりこれが全体の数 % を占めるレベルになると速度に影響でないことはない。これは古い過去の遺産 (回路規模をどうしても制限せざるおえない) なのだ!

 x86 は長いこと使われてきていて Intel もそれを理解していると思う。ただ、現に失敗した IA-64 こと Itanium は VLIW (Very Long Instruction Word) を使っているのだけど、これにも 1 長 1 短がある。あらかじめ命令レベルで並列化を行うのだけど、あらかじめある程度いり組んだ並列化を行われるので、ハードウエアでの再スケジュールをするとものすごい複雑になる。互換性にも乏しいし、辛いわけだ。

 そもそも VLIW は唯一のこういう前提がある。「コンパイラーが賢い」っていうね。しかし今でさえコンパイラーは賢くない。.NET の JITSIMD は使われていないし、ベクター化は容易ではない。

 結局、x86 に AVX を付けることで、legacy SIMD、SSE を排除していき、将来的には AVX だけの CPU になるのかなぁ、って思ったりするけど謎。

 そろそろ AVX-512 の話にいこう。

 AVX-512F だけど、これは AVX 3.1 や 3.2 で実装されるみたい。Xeon Phi Knights Landing や Skylake (Broadwell の次) では AVX-512F、Cannonlake (Skylake の次) では AVX-512 が実装される模様。

 まあ、お話なんで、いろいろ読んでたんですけど、CPU の進化はすごいのはいいんですけど、コンパイラーが全然進化してない…… .NET は早く SIMD コードはくように頑張ってほしいですね。

 ということなんだけど、

  • xmm* [127:0]
  • ymm* [255:0]
  • zmm* [511:0]

というレジスターたちを見て恐ろしいのは 64 個の byte が同時に演算できる… こわ。流石に掛け算は short じゃないと実装されないでしょうけど (現 SSE/AVX 命令が実際そう)。

 SIMD に興味持ってくれればうれしいなーっていう一心で書きました。私もあんまり詳しくないけど、もし興味を持ったならば少し調べてみると面白いですよ。CPU はすごい! ってわかりますから。いやまあ、表面に見える以上にすごいことやってるんですけどね。

 それではー。