C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

CPU: Intel が SIMD 命令の拡張にアフィン変換を追加する、という話の中身と影響する分野について

IntelSIMD 命令の拡張にアフィン変換を追加するらしい(参考2) との事で、 "Intel® Architecture Instruction Set Extensions and Future Features Programming Reference" (参考1) を見てきました。アフィン変換は Computer Graphics 界隈の人々が反応しやすいキーワードですが、今回の話はあまり "一般的な狭義の意味での CG 界隈" とは関係無いよ(いまのところ)という話です。

追加される(予定の) アフィン変換系の命令群

  1. GF2P8AFFINEINVQB ; Galois Field Affine Transformation Inverse (=ガロア域アフィン逆変換)
  2. GF2P8AFFINEQB ; Galois Field Affine Transformation (=ガロア域アフィン変換)

命令の概要

何れもガロア域 28 におけるアフィン変換の計算を SIMD レジスターを用いて行うCPU命令。 Inverse の方は 8x8 bit の行列 A 、 8-Bit ベクターx, b について A * inv( x ) + b を計算、他方は A * x + b を計算するもの。

この計算は AES 暗号の S-box 回りの計算。もし暗号技術に興味があり、それが一体何なのかについてより詳しく理解したい方には書籍「暗号技術のすべて」(参考6)のAES暗号の解説がたいへん詳しくわかりやすいのでおすすめ。

想定される主な用途

  • AES 暗号技術( AES 暗号の "Rijndeal S-box" まわりの計算が今回話題の GF2P8AFFINE 系命令の適用そのもの; 参考3,4,5 )
    • Note: AES = Advanced Encryption Standard (参考5)
    • Note: Rijndeal (ラインダール; 参考3)

(一般的な狭義の意味での)CG屋さんへの影響

と、いうわけで、「アフィン変換」と聞いて反応しそうな(2次元、3次元での線形幾何を主戦場とする)CG 屋さんたちには今回は関係無いからひとまず安心して寝ましょう、というお話でした。ちなみに、 AVX のレジスターは 512-Bit なので、ここでいう狭義の CG 界隈で一般的な 32-Bit float の 4x4 行列を扱おうにもオペランドを1つロードしただけでレジスターが埋まってしまいます。 GPU には 16-Bit float の対応もありますが、それはそれで CPU はネイティブに対応していませんし、 IEEE754/binary16 相当では 10 進数で 3 桁程度の精度しかありませんから実世界での用途は限られます。 AVX2048 …みたいなものが来れば CPU で 32-Bit float のここでいう狭義の CG 屋さん向けのアフィン変換命令も乗る事もあるのかもしれませんが、たぶん、少なくとも数年単位の近い未来までの事としては、"それは GPU でやってくれ" と Intel も考えているような気がします(関係者じゃないので知らんけど😋)。

参考