IntelがAVX系の拡張命令として「AVX10」を間もなく投入する。これによって、AVX系命令がまとめられ整理される。今後はAVX-512は非推奨となりAVX10が推奨されることになるだろう。今回は、現時点でのAVX10の状況について述べていく。
長くAVXの変遷を語ってしまった。本題のみ読みたいという方は「AVX10」という見出しまで読み飛ばしていただいて構わない。
AVXの沿革
CPUはプログラムから「命令」という形で、何をすればいいかを解釈しながら演算や信号制御を行う。その命令はある程度標準化されており、IntelやAMDが採用しているのはx86と呼ばれるものだ。x86命令はCISCと呼ばれるもので、命令の実行時間は可変長であるが、複雑な処理をする際には、その処理を完了するまでに、命令が多数必要となってしまう。そのため、よく使われる複雑な処理に対しては一つの命令、あるいは少ない命令で済むようにCPU側と命令を改良し、新しい命令を追加する。この新しく追加された命令を拡張命令と呼ぶ。
また、CPU内に新しい演算器やアクセラレータが設置された場合にも、それらで演算を行うために新しい拡張命令が追加されることがある。
もちろん、拡張命令の対応はCPU側の対応も必要となる。そのため、拡張命令セットに対応するかしないかというのは製品単位で変わり、リリース後に仕様変更でも無い限り有効化されることはない。
拡張命令の説明はここまでにして、次にAVXの沿革について見てみる。通常、CPUはフリンの分類においてSISDに分類される。SISDは一つの命令を一つのデータにしか適用できない。つまり、1回の命令で変更できるデータは1つまでであり、複数のデータを変更したい場合は、何度も命令を繰り返す必要がある。
これは、特に配列に並べられた様なデータを処理する際に非効率である。そのため、一つの命令で複数のデータを変更できるSIMD命令を追加することで、効率化を図る方針となった。そして追加されたのがSSE命令であり、これがAVXの基となる。
SSE命令では、CPUに128-bitのレジスタを追加し、このレジスタを32-bitずつあるいは64-bitずつに区切ってデータを格納することで、一つの命令で、最大4つの32-bitデータあるいは最大2つの64-bitのデータを処理できる。これがSSEである。こうすることで並列演算が可能になった。
SSEはそのまま拡張されていくことになり、現在のx64の礎となっているAMD64にはSSEが標準に実装された。
2011年に大幅にSSEを改良したAVXが登場した。AVXでは、レジスタが256bitとなり、最大8つの32-bitデータあるいは最大4つの64-bitデータに対して命令を適用することができるようになった。
そして、2016年ごろに512-bitのAVX-512が登場して現在に至っている。
AVX-512
AVX-512は、その名の通り512-bitのレジスタを持っているため、1命令で最大8つの64-bitデータ(倍精度)と最大16つの32-bit(単精度)の演算が可能となっている。AVX-512は最初Xeon Phiに採用されたが、一般のCPU向けとしてはSkylakeアーキテクチャのサーバー向けラインナップからの採用となっている。
AVX-512によってより高い性能のSIMD命令が数多く追加され、また並行実行できるデータの数も増えたため、グラフィックやデータ分析など、様々な分野で性能や効率の向上を果たすことができた。
その後、AIなどを中心とした低精度演算の需要などによって、AVX-512が拡張された。
AVX-512の課題
Intelが定義したAVX-512の課題は大きく2つある。「AVX-512の複雑性」と「512-bitレジスタ」である。
AVX-512には、「AVX-512-VNNI」や「AVX-512-4FMAPS」のように、様々なサブセットと呼ばれる命令群がある。これらのサブセットはAVX-512のコンポーネントであるが、それらは同時に追加されたわけではなく、需要やターゲットによって拡張されてきたという変遷をたどってきた。
結果として、AVX-512に対応していたとしても、製品やラインナップによって対応しているサブセットが異なるという事態が発生した。この問題は主に事業を行う際の製品選定に影響を及ぼす。AVX-512が用いられるようなソフトウェアには、製品に最適化を施していることが前提であるという場面も少なくはない。その中で、製品を更新する際などにサブセットが対応しているかいないかは非常に重要である。このときに、AVX-512の多岐にわたるサブセットはその複雑性を増している。
これが、AVX-512の複雑性という問題だ。
もう一点の「512-bitレジスタ」であるが、これは主に民生向けの製品において重要になる。
AVX-512は、512-bitのレジスタを大前提とした命令セットである。そのため、512-bitレジスタあるいは仮想的に512-bitレジスタを実現できないCPUでは利用することができない。
IntelはAlder Lake以降の民生向け製品において「Intel Hybrid Technology」を採用し、Pコア・Eコアという2つのアーキテクチャを同梱し同時に駆動させる製品を展開している。ここで問題なのが、Eコアには512-bitレジスタが搭載されていないという点だ。
一つのCPUに、対応する命令セットがバラバラなコアが混載されるような場合、それらを完全に活用するようにCPUを制御するのは非常に難しい。そのため、IntelはIntel Hybrid Technologyを採用している製品においては命令セットをEコア側に合わせるという対応を行った。
結果、Ice Lake/Tiger Lake/Rocket Lakeという前世代の製品がAVX-512をサポートしていたのに対して、Alder Lake以降の次世代の製品がサポートを欠くという状況となり現在まで続いている。
さらに問題なのが、AVX-512は最新のSIMD拡張命令であるため、512-bitレジスタに関係なく低精度演算の対応などの拡張が行われたのにたいして、Intel Hybrid Technologyで最上位のAVX2ではその様な命令が存在しなかったという点である。
Intelもさすがにそれはまずいと思ったのか、AVX-512の機能の一部をAVX2にも追加するという施策を行った。例としては、Meteor LakeのAVX-VNNIが挙げられる。そして、この様な拡張は、AVX-512のみならず、遡ったAVX2の複雑性にも寄与している。
このように、AVX-512には「AVX-512の複雑性」と「512-bitレジスタ」という課題がある。これを同時に解決しようとしているのがAVX10だ。
AVX10
AVX10は2023年にIntelが発表した新しいSIMD拡張命令セットだ。実質的にAVX-512の後継となる。
AVX10の特徴は「512-bitレジスタを必須としないこと」「AVX-512のすべての機能の包括」「バージョン型による命令セットの管理」である。
まず「512-bitレジスタを必須としないこと」について。これは、512-bitレジスタを持っていないEコアの様なCPUコアでもAVX10命令を実行できるという特徴である。基本的に256-bitでの動作を前提とし、オプションで512-bitレジスタをサポートする。こうすることによって、Pコア・Eコアの双方がAVX10の命令を利用できるようになる。
更に、AVX10はAVX-512のすべての機能を包括するので、256-bitレジスタのCPUでもAVX-512の機能の恩恵を享受できる。
そして、命令や演算の最適化も行われているので、AVX2でコンパイルされたプログラムについても、AVX10で再コンパイルすることで性能が上る可能性がある。
「バージョン型による命令セットの管理」であるが、AVX-512では、命令サブセットをフラグという形で管理していたが、AVX10ではバージョンで管理する事となった。こうすることで、AVX10命令の対応度合いなどがよりわかりやすくなる。
実際すでに「AVX10.1」と「AVX10.2」についてアナウンスされており、AVX10.1では、新機能の搭載はないもののAVX-512の機能をAVX10に移植する作業が行われ、AVX10.2ではAVX-512にもないFP8精度の演算のサポートなどの新機能が追加されている。
バージョンによる管理のため、今後AVX10が拡張されたとしても、複雑性がAVX-512ほど増すことはないだろう(USBみたいな付番にしない限り)。
このようにAVX10はAVX-512の優れた機能と性能を維持しながら、可用性を高め、更に命令を整理することでわかりやすくしている。
今後の見通し
AVX10はIntelが開発した命令セットであるため、Intelが選考して実装している。
まず、AVX10.1が今年登場する見込みのGranite Rapidsに搭載される。AVX10.1はAVX-512命令を仕様の変更無しに移植しているため、まだ512-bitレジスタを必要としている事が考えられる。AVX10.1はこれ以上の展開は見込まれず、実際に幅広く展開されるのはAVX10.2だ。
AVX10.2が現在アナウンスされており、近い将来登場する見込みだ。AVX10.2はEコアにも対応するため民生向け製品への搭載も期待される。
おそらく早ければ2025年リリースの製品で搭載されることが考えられるが、残念ながら今年登場のLunar LakeとArrow LakeでのAVX10.2の搭載は考えられない(可能性としてPコアがAVX10.1の命令に対応している可能性はあるが)。