CPUの処理性能を上げる方法は複数ある。最も簡単なのは、動作クロックを早くして1秒間に実行できる命令の数を増やす方法だ。
ただし、この方法では、1つのプログラムは早くなるが、複数のプログラムを同時に実行(時分割実行)する場合には、それぞれは早くなるものの、全体としては性能効率が落ちてしまう。

Windowsのようなオペレーティングシステムが動き、システム側、ユーザー側のプログラムが複数実行されるような場合、あるいは1つのプログラムが複数のスレッドを起動するような場合がある。このような場合にCPUを複数のコアとして作る(マルチコア)、あるいはCPUを複数装備する(マルチプロセッサ)方法がある。この方法は高速化が期待でき、単純にクロック周波数を上げる方法も併用できるため、高速化が期待できるものの、コストが高くなってしまうというデメリットがある。

このほかに、命令の実行を工夫して、1クロックあたりの命令実行数を挙げるという方法がある(投機実行やスーパースケーラー)。しかし、この方法では、通常のプログラムを実行させたときに、同時実行可能な命令の組み合わせが有限で、上限ができてしまい、無制限に効率をよくできるわけではない。

最後の方法として、1命令で処理可能なデータ数を増やすという方法がある(表01)。1つの命令で複数のデータを同時に計算することを「SIMD」、Single Instruction, Multiple Dataという。この方法では、たとえば3次元の座標計算といった複数データに同じ演算を施す処理は高速化が期待できSIMD命令を使う価値があるが、通常の命令の並びを高速化(ベクトル化)することは困難で、特定の処理だけを高速化できる。

インテル系のプロセッサでは、1997年のPentiumプロセッサでMMXとして最初に搭載された。MMXは、x86のNDP(数値演算コ・プロセッサ)が利用する80ビットの8段スタックの64ビットをレジスタとしてアクセスするMMXレジスタを演算に利用する。CPUとNDPが分離して、別プロダクトになっていたのはi486 CPUまでで、Pentiumプロセッサから、浮動小数点演算を行うNDPはCPUに標準で内蔵された。
NDPは、Intel 486でも統合が行われたが、マーケッティング的な理由で無効にされ、NDPを有効化したIntel486をコプロセッサとして販売した。

Pentiumに装備されたMMXは、1989年のi860 RISC マイクロプロセッサやi750 GPUセットなどに搭載されたSIMD機能を流用したもの。整数演算を行う56個の命令を追加したが、演算レジスタは、NDPのスタックをそのまま使う。NDPのスタックを流用したのは、コンテキストスイッチなどの仕組みがすでに動いており、SIMD機構の追加による改良を小さくするためと考えられている。ただし、一回MMX命令を使ったあとNDPによる浮動小数点演算を行うためのクリーンアップが必要で、NDP浮動小数点演算とMMX(整数SIMD演算)を交互に使うと、切り替えのためのオーバーヘッドが無視できなくなる。

こうした問題に対処するため、新たに1999年に搭載されたのがSSE(Streaming SIMD Extensions)だ。SSEでは、16本の128ビット XMMレジスタ(64ビットモードの場合)を新設し、x87/MMXとのレジスタ共有を止めた。これにより、SSEによるSIMD演算と、x87浮動小数点演算を独立して行えるようにした。また、SSEは、浮動小数点演算にも対応した。これによりMMXは非推奨となり、互換性のために残されることになった。

SSEは、2008年まで9年にわたって利用され、その間に命令も追加され最終的には313個の命令が追加された。問題は、SSEもMMXと同じくESCプリフィックスを先頭に置くコプロセッサ命令体系を継続していたこと。
Escプリフィックスは、外部コプロセッサ用プリフィックスで、コプロセッサがない場合、Escプリフィックスを検出したら、未定義命令処理を経て、ライブラリ呼び出しを行っていた。4つの32ビット単精度浮動小数点演算から始まったSSEは、SSE2で8、16、32、64ビット整数、64ビット倍精度浮動小数点などに対応するなど、段階的に強化が行われる間に313個も命令が追加された。

これを仕切り直そうとしたのがAVX(Advanced Vector Extensions)で、一定の命令パターンを決め、VEXプリフィックス(2バイト用0xC5、3バイト用0xC4)を使うことにした。またSSEの128ビット XMMレジスタを拡張し256ビットのYMMレジスタを新設した。AVXでは、浮動小数点(単精度、倍精度)を想定していたため、整数演算性能が向上しなかった。

整数演算を256ビットまで対応させ、積和演算(FMA。Fused Multiply-Add)を追加したAVX2を2013年に搭載した。さらに2016年には、512ビットのZMMレジスタを新設したAVX-512が追加される。AVX-512では、多数の機能フラグが設定され、フラグにより利用可能な命令を判定できる。しかし、フラグのパターンは、CPUの実装に任されたため多数のバリエーションができてしまった。

これを解決しようとしたのが2023年に提案されたAVX10で、バージョンにより、機能(命令)を特定できるように整理しなおした。現在の最新バージョンは、AVX10.2で、省電力のEコアと高性能なPコアは256ビットまでが最小実装となり、Pコアは512ビット対応が必須となった。


また、同じ2023年には、行列演算機構であるAMX(Advanced Matrix Extensions)が登場した。これは、従来とは異なる演算機構、独立したタイルレジスタ(1キロバイトのタイルレジスタが8個)を利用する。

今回のタイトルネタは、1989年のMS-DOSのゲーム「SimCity」である。プレーヤーは市長となり、勝手に発展していく都市に予算(税金)でインフラや施設などを追加、削除しながら、都市を発展させていく。IBM PC上のMS-DOSで動作するため、日本語(ウルトラ警備隊)をグラフィックスで表示するという作者のこだわりがある。「Sim」は、携帯電話で有名になる前は、simulation(模擬実験)あるいはsimulation gameの略称として使われていた。このSimCityは大部分が仮想コードで記述され、実行エンジンを移植すると、簡単にゲームの移植が行えた。仮想コードはオープンソースとなったが、商標の関係から名称が「micropolis」となっている。
編集部おすすめ