ストリーミングSIMD拡張命令(英:Streaming SIMD Extensions、略称:SSE)は、インテルが開発したCPUのSIMD拡張命令セット、およびその拡張版の総称である。後継のAdvanced Vector Extensions (AVX) とAdvanced Matrix Extensions (AMX) についても本項で記載する。
SSEは、x86アーキテクチャに8本の128ビットレジスタを新設し、浮動小数点演算のSIMD処理を実現したものである。AMDのK6-2に実装されたSIMD拡張命令3DNow!に対抗する形でPentium IIIから実装された。4個の32ビット単精度浮動小数点データを一本のレジスタに格納し、同一の命令を一括処理することができる。拡張命令であるため、その機能を使用するためにはSSEに対応したソースコードを作成し、プログラムをコンパイルする必要がある。伝統的なベクトル型CPUと比較したときにいくつかの仕様が欠落(例えば可変長ベクトルが扱えない,疎行列に弱いなど)しているものの、ベクトル計算をサポートする機能ではある。x86アーキテクチャのCPUは本質的にはスカラー計算機であるが、SSEやAVXの使用により簡易的なベクトル計算機として機能するようになる。SSEやAVXを用いて並列化を行うことをベクトル化と呼ぶ。
Core Duoまでのインテル製CPU、K8までのAMD製CPUでは、64ビット幅の演算器を用いて128ビット演算命令を2クロックかけて実行するという実装であったため、128ビット演算命令を用いても実質的なスループットはクロックあたり64ビットであった[注 1]。そのため従来から存在するMMX命令やAMDの3DNow!命令に対する性能面でのアドバンテージは128ビット幅のレジスタを使えるという点以外では小さく、むしろ並列度が上がった分だけ最適化も煩雑になるという欠点が目立った。また当時のRISC系CPUに搭載されているSIMD命令では128ビット演算命令を1クロックで実行できるものがあり、これらに対する性能的なディスアドバンテージは小さくなかった。最終的にはCoreマイクロアーキテクチャ/AMD K10より128ビット演算命令も1クロック処理が可能な形態へと改良され、SSE命令の実用性は大幅に向上した。
元々はインターネット・ストリーミングSIMD拡張命令(英:Internet Streaming SIMD Extensions、ISSE)と呼ばれていたが[1]、命令内容そのものはインターネットとは直接関係が無くマーケティング的な要素が強かったため、現在ではインターネットの文言が外され単にSSEと呼ばれるようになっている。
SSEの機能を強化したものにSSE2やSSE3、SSSE3(Supplemental/補足的なSSE3)、SSE4がある。また、SSEは他社製品にも採用されている。SSEの後継はAVXである。
後述するが、SIMD命令の実行は追加の演算回路を動かす関係で並列計算と消費電力増加がセットで起きるため、むやみにSSEやAVXを使用するべきではない(ループ処理があるからといって反射的にベクトル化を行うことは大幅な非効率化を招く)。まずは常時動作しているALUの動作(つまり一般的な命令を使う)だけでも十分かどうか入念に検討し、ALUだけで処理速度を稼げる(無駄な処理を削減する)ように工夫する必要がある。SSEやAVXの回路規模が大きくなるにつれて消費電力増加のペナルティは増えているため、最高速度を目指す必要がない場合には、SIMD命令を一律排除して消費電力の削減を行うことも有効である。プログラマが全体最適を意識して手書きでアセンブラを書くことは非常に難しいため、コードの規模がある程度以上大きくなる場合には高級言語を使い、コンパイラ最適化に頼ることも必要になる。
SSEやAVXでは128bit,256bit,512bitなどの長いレジスタを扱えるようになるが、マルチコアによる並列化と比較すればSSEやAVXを用いたベクトル化は地味な効果しか得られないことが普通である。であるにもかかわらず、アセンブラを手書きして性能を引き出すためには高度な(世界トップクラスのプログラマですら習得が困難な)プログラミング技術が要求されるため、一般的にはコンパイラの自動ベクトル化機能を介して利用することになる。あくまでもCPUに内蔵される補助的なベクトル計算機能に過ぎないため、性能向上は30%程度(例外的にFFmpegで数十倍の高速化事例あり(後述))の高速化が上限であり、並列度を大幅に上げて膨大なデータを処理する場合はGPGPUに移行する必要がある。ただし、CPUに内蔵される機能であるため、追加の演算装置が必要ないことや、GPGPUと比較した場合にレイテンシが少ないという利点はある。SIMD命令の実行によって同時に複数の演算回路が動くとCPUの消費電力は大幅に増える(レジスタ長が長いほど問題が大きくなる)ため、僅かな性能向上しか達成できない場合は全く使用しない(コンパイラに与えるフラグで無効化する)という割り切りも必要である。計算速度を最優先とする高性能計算(HPC)の分野を除けば、消費電力の増加を回避するため、SSEやAVXの使用を見送って基本となるALUの範囲で無駄を省いて高速化を行ったアプリケーションは数多く存在し、それでも必要十分なパフォーマンスを得られることが実証されている。最優先で行うべきことは、SIMD命令の導入ではなく、常時動作しているALUを高効率で動作させた(つまり一般的な命令の使い方を最適化する)だけでも十分かどうか検討することである。
低レベルプログラミングは、x86/x64アーキテクチャのアセンブラについて初歩から記載した導入書籍である。下記の公式マニュアルと併せて利用すること。アセンブラを扱う開発者が少ない関係で、情報が古いことも多いため、検索エンジンを用いて命令の記述を検索することは避けるべきである[2]。
下記の公式マニュアルにSSEとAVXを含めたx86/x64アーキテクチャについての全ての仕様が網羅されているため、実際の開発においては下記を参照すること。下記は唯一かつ確実な情報源である。x86/x64アーキテクチャの全ての仕様を網羅した上でのアセンブラの取り扱いは一般的にはコンパイラが行うようなことであるため、本格的なソフトウェア開発においてはインテルコンパイラの導入も検討すること。
Intel® 64 and IA-32 Architectures Software Developer Manualsに、アセンブラについての全ての仕様が記載されている。
Intel® 64 and IA-32 Architectures Optimizationには、あらゆる命令を使用したベクトル化を含む最適化方法が記載されている。
Pentium IIIにはじめて実装された。追加された命令数は70[3]。Pentium IIIの開発コードネームがKatmaiであったことから、KNI (Katmai New Instructions)[4]やMMX2[5]とも呼ばれていた。廉価製品のCeleronにおいても、その第三世代製品Coppermine-128k よりSSEに対応している[6][7]。
AMDによるSIMD拡張命令セット3DNow! Professionalは、SSEと互換性がある[8][9]。
SSE2は従来のSSEに144個の新たな命令が加えられた[3]。具体的には64ビットの倍精度浮動小数点演算のサポートおよびMMXを128ビット幅に拡張する整数演算命令の追加、キャッシュの制御機能の強化がなされた。
SSE2はPentium 4で初めて実装された[10]。AMDのAMD64アーキテクチャでは、浮動小数点演算に従来のx87命令ではなくSSE/SSE2のスカラ演算命令を用いることを標準としたため、拡張命令ではなく基本命令としてSSE、SSE2が取り込まれている。
SSE3はSSE2に13個の新たな命令が加えられた[3]。具体的にはメモリアクセスおよび複素数計算の高速化、仮想CPUのスレッドの動作制御などの機能が搭載され、主に動画圧縮の処理が向上した。
SSE3の名称が発表される前はPNI (Prescott New Instructions) と呼ばれていた[3]。Pentium 4のPrescottコア(2004年 -)で初めて実装された。
SSSE3 (Supplemental SSE3) はSSE3に32個の新たな命令が加えられた[3]。CoreマイクロアーキテクチャベースのマイクロプロセッサIntel Core 2 (Conroe) /Intel Xeon (Woodcrest) で初めて実装された。
SSSE3と名付けられる前はMNI (Merom New Instructions; 旧称Tejas New Instructions) という名称があった[3]。登場当初はSSE4と呼ばれると一般的には思われていた。
45nm世代のCore 2のPenrynで搭載。47個の命令が追加になる。
Nehalemマイクロアーキテクチャの第1世代Intel Core iで初めて実装された。7個の命令を追加。SSE 4.2の追加命令は以下の通り。
AMD Phenomで搭載。キャッシュ関連や挿入、展開の4命令が追加。インテルのSSE4とは名前は似ているが互換性は無い。
x86プロセッサにおいて融合積和演算を実現するための拡張命令[11]がFused Multiply-Add (FMA)である。2007年にAMDがSSE5命令の一部として、2008年にインテルがAVX命令のサブセットとして採用を発表したが、両者の仕様は異なるものであった[12]。その後、インテルは2009年初頭にFMA命令の仕様を変更し、4オペランド (FMA4) をやめ3オペランド形式 (FMA3) とした[12]。2009年5月にはAMDがSSE5命令の採用を取りやめ、AVXのサポートを表明したため、仕様の統一が図られたかと思われたが、FMA命令に関してはインテルが仕様を変更する前の4オペランド版FMAを採用したため、FMA4とFMA3という二系統のFMA命令が混在していた。その後、AMDがZenマイクロアーキテクチャでFMA4の削除およびサポートの打ち切りを表明したことで、FMA命令についても仕様の統一が図られた[13]。
FMA命令では±(A×B)±Cの形で表現される単精度/倍精度の浮動小数点演算を1命令で実行できる。乗算結果の符号を反転するか、乗算後に加算を行うか減算を行うかによって以下の4つのバリエーションがある。
いずれの命令も単精度/倍精度、スカラ/ベクタを問わず全てのタイプの演算に適用可能である。他にもベクタ専用のMADDSUB命令が存在し、1,3,5...番目の要素にMADDを、0,2,4...番目の要素にMSUBを行うという命令になっている。
FMA命令に対応した演算器においては、上記の浮動小数点演算を1クロックサイクルのスループットで実行可能で、加算のみ、乗算のみを実行できる演算器と比較すると理論FLOPSを倍にすることができる。また、乗算の結果に対しては丸めを行わず、加算を行った後に一度だけ丸めを行うため、乗算と加算を独立して実行するのと比較して丸め誤差を小さくできるという利点もある。実装としてはAMDではBulldozerマイクロアーキテクチャでサポートされたのが最初で、モジュールあたり2つの128ビットFMA演算器を搭載している。インテルはHaswellマイクロアーキテクチャで初めてサポートしており、コアあたり2つの256ビットFMA演算器を搭載している[14]。
インテルが2008年に発表した時点でのFMA命令セット[12]。完全な4オペランドを実現しており、3つのソースオペランドとディスティネーションオペランドを独立に指定できる。その後インテルは仕様を変更したために採用を取りやめたが、AMDはBulldozerマイクロアーキテクチャにおいてこの命令セットをサポートし続けていた。その後AMDが発表したZenマイクロアーキテクチャで削除されることとなった[13]。
インテルが2009年に仕様を変更し、現在使われているFMA命令セット(FMA instruction set[15])。4オペランド方式をやめ、3つのソースオペランドのうち任意の1つを破壊することにより3オペランドでFMAを実現している。インテルはHaswellマイクロアーキテクチャ以降で、AMDはBulldozerマイクロアーキテクチャのPiledriverコア以降でサポートしている。なお、AMDが当初SSE5において採用したFMA命令も同じ3オペランド方式であった[16]。
ベーシックなmm256_fmadd_ps命令の場合、Intel CPUで1サイクルあたり16個の単精度FMA演算を実行する[17][18] (256 [bit/inst.] ÷ 32 [bit/fp32FMA] ÷ 0.5 [CPI=cycle/inst.][19])。例えば3GHzで動作するプロセッサであれば1コア当たり 48 GMAC/s (=96 GFLOPS) のピーク性能を可能にする(参考:FLOPS#代表的なハードウェアの浮動小数点数演算能力)。
FMA4と比べるとレジスタの退避を行う必要がある場合に不利であるが、命令長を1バイト短くすることができるため、デコーダの実装や命令キャッシュのフットプリントでは有利である。インテルのIvy Bridgeマイクロアーキテクチャ以降やAMDのBulldozerマイクロアーキテクチャでは、レジスタ・リネーミングによってレジスタ間のmov命令をゼロレイテンシで実行できるため、これと組み合わせればレジスタ退避のペナルティは軽減できる。
インテルのマイクロプロセッサにおいてはAVX2命令と同時に採用されたため、AVX2命令の一部であると誤解されることがある。しかし、両者のCPUIDフラグは独立に設けられており[20]、必ずしも両者が同時にサポートされているとは限らない(例えば、FMA3をサポートするAMDのPiledriverコアではAVX2命令はサポートしていない)。
MMX/SSE後継のSIMD拡張命令セットで、呼称がIntelAdvancedVectorExtensionsとなった。Sandy Bridgeマイクロアーキテクチャ(2011年 -)で初めて搭載された[21][22]。浮動小数点演算の演算幅がSSEの2倍の256ビットとなり、1命令で8つの単精度浮動小数点演算もしくは4つの倍精度浮動小数点演算を実行することができる。また、命令デコード性能向上のため、新しい命令フォーマット(VEXエンコーディング)が採用されている。3 or 4オペランドの非破壊型命令もサポートするため、レジスタ退避・復元処理の記述を省くことができる。この非破壊型の命令フォーマットに関しては従来の128ビット幅のSSE命令にも使うことができるため、AVXに対応したプロセッサでは新規に導入された256ビット命令を使わなくてもSIMD演算の性能が向上する可能性がある。
SSEが導入された際には専用の128ビットレジスタが新設されたが、AVXの256ビットレジスタは下位の128ビットを既存のSSEレジスタと共有している[22]。そのためSSE命令とAVX命令の間でのデータ交換は容易である。ただし、256ビットのAVX命令と既存のSSE命令を混在させると、SSE命令を実行する際にAVXレジスタの上位128ビットを退避するというペナルティが発生するため、パフォーマンスが落ちる。これを避けるためには、256ビット命令の実行後にVZEROUPPER/VZEROALL命令を実行して明示的にAVXレジスタの上位128ビットをクリアするか、SSE命令をVEXエンコーディングを使ったものに置き換える必要がある。VEXエンコーディングの128ビット命令はAVXレジスタの上位128ビットを保持せずにゼロクリアするという挙動になっており、AVXレジスタの部分的な書き換えが発生しないためである。
Sandy Bridgeでは当初のSSEの実装のように既存の128ビットの演算器を使って2サイクルで実行するようなことはせず、素直に乗算器や加算器などの演算器が256ビット幅に拡張されている[21]。これによって、実質的なピーク浮動小数点演算性能がNehalem世代の2倍となっている。
AMDはBulldozer世代向けに当初予定していたSSE5拡張命令をキャンセルし、AMD FXではAVXがサポートされることになった[12]。ただし、256ビット命令に関しては128ビット幅の演算器を2つ使って実行しており[23][24]、スループットは従来のSSE命令と変わらない。
AVX2はAVXの後続となる256ビットレジスタ対象の拡張命令セットである。
256ビットレジスタ上の整数ベクトルに対する算術 (add, sub, mul, madd, abs, sad, sign)、比較(eq, gt)、統計 (ave, min, max)、論理 (and, or, xor, andnot) 、シフト (sll, sra, srl, alignr)、変換 (convert)、要素操作/swizzle (permute, shuffle, broadcast, insert, blend, unpack, pack, extract) をサポートする。また整数ベクトルの入出力 (stream load, masked load/store)、マスク生成 (movemask) も追加されている。シフト命令は要素ごとに独立したシフト量を設定できる。
浮動小数点ベクトルにも影響する命令としてはgather命令(非連続なデータを並べ替えながらロード)が導入されている。
インテルはHaswellマイクロアーキテクチャから搭載している[25]。AMDはExcavatorアーキテクチャからAVX2を実装している[26]。ただし、SIMD演算ユニット自体はZen+まで128bit幅に留まっていたため、AVX2命令を多用する処理はあまり高速化されていなかった。Zen2世代からは256bit幅になり処理速度が改善されている。
実装としてIntel CPUではベクトルレジスタとベクトル用実行ユニットを用いて計算される。例としてint8積和演算(VNNI等価)では"Vec Mul"および"Vec ALU"実行ユニットが典型的に利用される(下表)。
| μarch | 実行ユニット | |
|---|---|---|
| VPMADDUBSW,VPMADDWD | VPADDD | |
| Haswell | "SIMD Misc" x1[27] | "SIMD ALU" x2[28] (Port 1, 5) |
| Skylake | "Vec Mul" x2[29] (Port 0, 1) | "Vec ALU" x3[30] (Port 0, 1, 5) |
| Sunny Cove | "Vec Mul" x2[31] | "Vec ALU" x3[32] (Port 0, 1, 5) |
| Golden Cove(英語版) | "Vec Mul/FMA" x2[33] (Port 0, 1) | "Vec ALU" x3[34] (Port 0, 1, 5) |
| Gracemont(英語版) | ||
Intel AVX2 Vector Neural Network Instructions (AVX2 VNNI) は整数積和演算の効率化を目的とした拡張命令セットである[35]。AVX-512のサブセットとして導入されたAVX-512 VNNIをAVX2 (整数ベクトルレジスタ) へバックポートしている。[int8 | int16]・[非飽和 | 飽和] の組み合わせに対応した4種の整数積和演算(vpdp[bu|ws]sd[|s])からなり、組み込み関数/intrinsicsとしては[XMM (_mm_) | YMM (_mm256_) ] およびAVX512 VNNIとの区別(_avx)をさらに組み合わせた計16個が定義されている。
Intel CPUでは第12世代Intel Core(Alder Lake)から対応している[36]。int8の場合FMAと同じ256bitレジスタを用いて4倍の要素を積和できるため、命令スループットが同等なら[37][38]FMA比4倍の演算スループットを得られる。
2013年に製品への搭載が開始された。ZMMレジスタを512ビット長とし[39]、レジスタ数も16から32に増やした。
発表されている命令群には、扱うデータや処理の差によって、AVX512F, AVX512CD, AVX512DQ, AVX512PF, AVX512ER, AVX512VL, AVX512BW, AVX512IFMA, AVX512VBMI, AVX512VBMI2, AVX512VAES, AVX512BITALG, AVX5124FMAPS, AVX512VPCLMULQDQ, AVX512GFNI, AVX512_VNNI, AVX5124VNNIW, AVX512VPOPCNTDQ, AVX512_BF16といった分類がされる命令群があり、どれをどこまで実装しているかは、製品によって異なる。一部は命令の仕様だけ公開されていてまだ製品に実装されていないものもある。このように実装レベルが異なるものが複数存在していることもあり、AVX-512に対応しているといっても、何をどこまで実装されているのか確認が必要な状況になっている(詳細は下記のAVX-512を実装したCPUを参照のこと)。こういった仕様の差異は対象とするCPUに合わせてコードの書き分けが必要になるなどするため、利用者においては混乱の元となっている。膨大な命令が存在することから、アセンブラを手書きして性能を引き出すためにはそれだけ高度な知識が必要となる。
AVX-512については有用性について批判が提出されており、業務用の高性能計算(HPC)を除いてほとんど役に立たないとも言われているのに対して、コンシューマー向けも含む幅広い製品に搭載されてしまっている現状がある。512bitという長いレジスタを操作することで消費電力も大幅に増える傾向があり、簡単にAVX-512を使用することができない状況が生じている。インテル自身も2022年以降に出荷されるコンシューマー向けのCPUでAVX-512の無効化に踏み切るなど、様々な意味で難しい立場に置かれている命令セットである。上記の特殊性により、AVX-512コードを記述できる開発者の数は非常に少ない現状がある。
2013年に高性能計算(HPC)の製品(Xeon Phi x200)で初めて搭載されたが、長らく一般的なアプリケーションでの活用方法が見出されていない命令セットになってしまっている。世界トップクラスのプログラマでさえ扱いに困る難解な命令セットで、特殊な条件下のみで有効であるため努力に対する見返りは少ない。当然のことながら、習得難易度は人間が読みやすいように設計された高級言語のみを扱う一般的なプログラマにとっては手の届かないほど高い水準にある(アセンブラの基本となるALUの命令の習得が難しく、発展形となるSIMD命令の習得は更に敷居が高くなるため)。現状では、AVX2を利用したアプリケーションと比較して劇的な性能向上が達成されているわけではない。膨大な命令群を使いこなす必要があることからアセンブラを手書きする方法は難易度が相応に高いため、全てをコンパイラに任せ、自動ベクトル化により程々の性能向上を達成することがほとんどではある。しかし、僅かながら手書きで入念に最適化したアセンブラで劇的な性能向上を達成した事例もあり、ごく一部のプロジェクトでは最大限の性能を発揮させるべく目下研究開発が続けられている状況にある。
2022年の時点では、SIMD命令を活用する代表的なアプリケーションである動画エンコードでは、x265をAVX-512を利用してエンコードを行ってもエンコード時間は7%しか短縮できず、一方で消費電力は29%も増大するという、非効率極まりない状況にあった[40]。しかし、2024年11月2日に、FFmpeg開発者が手書きのAVX-512コードで通常のC言語コードと比較して最大94倍の性能向上を達成したとの報告を行っており、この成果はFFmpegに実装されインターネットを通して広く配布されている。動画エンコードは今後の開発が望まれるアプリケーションになっている[41][42]。
最も効果を発揮するアプリケーションの1つにRPCS3と呼ばれるPlayStation3エミュレータがあり、AVX2では190FPSで動作するゲームが、AVX-512を有効化すると235FPSで動作するようになり、約23%高いパフォーマンスを発揮するようになったとの報告がある[40]。
上記のように、AVX-512の利用方法を発見する作業自体が高度な研究開発になるため、製品への初搭載から10年以上経った今でも活用が遅々として進んでいない現状がある。そもそもアセンブラを理解できるプログラマが極めて少ない昨今では、AVX-512をアセンブラレベルで直接扱うことができるのは世界でも極々一部のプログラマのみである。
従って、AVX-512は特殊な条件下でのみ有効に機能すると結論付けられる。次世代の命令セットであるAVX10ではAVX-512の有用性に関わる様々な問題が部分的に解決される見通しであるが、やはり高度なSIMD命令である以上、特殊な条件下でのみ有効であることは変わらないと予想できる。
Subset | F | CD | ER | PF | 4FMAPS | 4VNNIW | VPOPCNTDQ | VL | DQ | BW | IFMA | VBMI | VNNI | BF16 | VBMI2 | BITALG | VPCLMULQDQ | GFNI | VAES | VP2INTERSECT | FP16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Knights Landing (Xeon Phi x200, 2016) | Yes | Yes | No | ||||||||||||||||||
| Knights Mill(Xeon Phi x205, 2017) | Yes | No | |||||||||||||||||||
| Skylake-SP,Skylake-X (2017) | No | No | Yes | No | |||||||||||||||||
| Cannon Lake (2018) | Yes | No | |||||||||||||||||||
| Cascade Lake (2019) | No | Yes | No | ||||||||||||||||||
| Cooper Lake (2020) | Yes | No | |||||||||||||||||||
| Ice Lake (2019) | Yes | No | Yes | No | |||||||||||||||||
| Tiger Lake (2020) | Yes | No | |||||||||||||||||||
| Rocket Lake (2021) | No | ||||||||||||||||||||
| Alder Lake (2021) | PartialNote 1 | PartialNote 1 | |||||||||||||||||||
| Zen 4 (2022) | Yes | Yes | No | ||||||||||||||||||
| Sapphire Rapids (2023) | No | Yes | |||||||||||||||||||
| Zen 5 (2024) | Yes | No | |||||||||||||||||||
第12世代Intel Core(Alder Lakeマイクロプロセッサ)以降のパソコン向けでは基本的にAVX-512が利用不可になった。Alder Lakeでは2種類のコアを搭載している。PコアのみAVX-512命令セットが実行可能となっており、Gracemontアーキテクチャに基づくEコアでは非対応である。一部のマザーボードではBIOSバージョンとリビジョンの組み合わせにより、Eコアを無効化することでAVX-512を有効化できる。[67][68]Intelは最新リビジョンのAlder LakeではAVX-512命令のサポートをシリコンレベルで打ち切っている。[69]
AVX-512 Vector Neural Network instructions (AVX-512 VNNI) は畳み込みニューラルネットワークの整数演算(int8, int16)の効率を目的としたAVX-512のサブセットである[70]。AVXでは高効率のINT8積和演算としてVPMADDUBSW/VPMADDWD/VPADDD の3連続命令が利用されている(AVX2なら4要素積和演算を8レーン同時に実行可能)。VNNIはこれを VPDPBUSD 命令のみでおこなうものである[71]。
Linux開発者のリーナス・トーバルズは下記のように批判している[72]。下記引用文の原文はAlder Lake and AVX-512 にある[73]。
AVX512が苦しんで死ぬことを望んでいる。そして、Intelは、魔法のような命令セットを作り、よく見えるベンチマークを出そうと試みるのではなく、実際の問題を修正すべきだ
Intelは基本に帰って、自社のプロセスがちゃんと機能するようにすべきだ。そして、HPC(高性能コンピュータ)など意味のない特別なケースではなく、通常のコードにもっと集中すべきだ
通常の整数コードでパワーの限界に到達したい。動作周波数(memcpyを使うことになる)やコア(使えないゴミはスペースを占有する)を取り除いてしまうAVX-512のようなパワーウイルスではなく
2023年7月に AVX-512 の後継の AVX10 をインテルは発表した。AVX10 は AVX2 と AVX-512 の統合ベクトル命令セットアーキテクチャ(converged vector ISA)[74]である。また、AVX-512は様々なサポート状況のフラグで管理するのが複雑だったため、AVX10はAVX10.1、AVX10.2とバージョン番号で管理する相対的にシンプルな仕組みとなった。
AVX10.1はPコアのみのIntel Xeon 6(Granite Rapids マイクロアーキテクチャ)から対応。XeonのPコアのみ対応する。概ねAVX-512をそのまま引き継いだものである。[75][76]
AVX10.2からは、ARM64のScalable Vector Extensionと似た手法を採用し、128, 256, 512ビットレジスタどれであっても動作するようにして、パソコン用を含め、PコアでもEコアでも動作するようになる。インテルのパソコン向けCPUはかつてはAVX-512に対応していたが、Eコアを導入してから、Eコアで512ビットレジスタに対応できないため、AVX2に後退していた。[77]
Intel Advanced Matrix Extensions (AMX) はインテルが2020年にAVX-512 VNNIの拡張として発表した(2次元)行列を計算するために設計された拡張命令。今までのは(1次元)ベクトル計算だった。
2023年1月10日発売の第4世代Intel Xeon SP(Sapphire Rapidsマイクロアーキテクチャ)から搭載されている。基礎となるAMX-TILEの命令群と、8bit整数の行列を扱うAMX-INT8の命令群と、bfloat16の行列を扱うAMX-BF16の命令群から構成されている。Sapphire RapidsマイクロアーキテクチャではTMUL(Tile Matrix Multiply、タイル行列積)が実装されている。
タイル行列積の1コアあたりの命令数/サイクル[78]
AVX-512はINT8で256op/cycleだったため、8倍高速化した。
Intel Xeon 6(Granite Rapids マイクロアーキテクチャ)からAMX-FP16を実装[79]。
未だ開発が継続されている命令群であり、さらなる拡張が予定されている。
_mm_dpbusds_epi32(XMM128bit)では CPIが同等の0.5であることが明示されている。Intel Intrinsics Guide