コンピューター好きのブログ

主にコンピューター・ラズパイと電子工作・オーディオ関連の記事を書いています。

Intel Core iシリーズ以降に実装されたメインストリームCPUの拡張機能をまとめてみました

私は先日、LGA1155のマザーボードGIGABYTE GA-Z68P-DS3を中古で購入しました。いずれCore i7-2700KなどのK付きCore i7を搭載するつもりでいます。

 

intel CPU Core i7 i7-2700K 3.50GHz 8M LGA1155 SandyBridge BX80623I72700K

intel CPU Core i7 i7-2700K 3.50GHz 8M LGA1155 SandyBridge BX80623I72700K

 

 

今さらLGA1155のマザーボードを入手したのは、同じ4コア8スレッドのCore i7で比較したとき、第2世代Core i7-2700Kと第7世代Core i7-7700KのPassmarkスコアの差が、それほど大きくなかったためです。

Passmarkスコアは8709→12040と1.38倍ですが、中古市場の価格比は3倍以上となるため、Core i7-2700Kの方がコスパが高くお得だと判断したわけです。

 

しかしこのとき、Passmarkスコアのみを基準に判断をしたことが妙に引っかかっていました。

 

クロック周波数が高ければ単位時間当たりに実行可能な命令数が多くなるので、単純にクロック周波数が高いものが速いということは分かります。

しかし、SSEやAVXなどの拡張機能の違いが良くわかりません。

 

ということで、Core iプロセッサ以降に実装された主な拡張機能の違いと用途についてまとめてみました。

なお、拡張機能以外の様々な改良や、GPUについてはとりあえず対象外とします。

 

  

SSE4.2

機能

そもそもSSE(Streaming SIMD Extensions)とは一つの計算を複数のデータに対して行う形態(SIMD:Single Instruction Multiple Data)を実現する命令セットです。

1999年発売のPentium IIIで実装されました。

 

最初はSSE専用に追加された128ビットのレジスタを用い、4個の単精度浮動小数点数(32ビット)を同時に処理することができました。4個 × 32ビット = 128ビットですね。

その後さまざまな拡張が行われ、128ビットの中で色んなデータを扱えるようになりました。

 

SSE4.2では文字列やCRC巡回冗長検査(データの改ざんを防ぐ検査)に関する命令などが追加されています。

ちなみに、SSEの前に整数だけを扱えるMMXという命令セットがありました。しかし、SSEの登場で不要となり、しかもMMXは従来の浮動小数点数演算命令(FPU)と排他利用のため、今では非推奨なようです。

 

最初に実装されたアーキテクチャ

第1世代(Nehalem)

プロセッサーナンバーは3桁。例:Core i7-870

 

用途

SSEは様々なアプリケーションで使われていますが、SSE4.2で追加された命令がどれくらい使われているかは、ちょっとネットを調べる範囲では分かりませんでした。

Wikipediaによると、XMLドキュメントのパーシング(解析と値の取得)や転送データの改ざん検査の速度向上が見込めるようです。

 

EPTとVPID(VT-xの拡張)

機能

EPT(Extended Page Tables)は、メモリページテーブル(OS上のプロセスが意識するアドレスを物理メモリの実際のアドレスに変換するテーブル)を拡張し、ゲストOSのプロセスが物理メモリにアクセスする際のオーバーヘッドを軽減する機能です。

EPTを使うと仮想マシンにおけるメモリ周りの処理性能が改善されます。

 

VPID(Virtual Processor IDs)はTLB(メモリページテーブル変換用バッファのキャッシュ)をホストマシンや仮想マシンそれぞれに用意し、IDで切り替えるという機能だそうです。

この機能がないと、ホストマシンと仮想マシンの切り替え時、ひとつしかないTLBの内容が失われるため、切り替えるたびにキャッシュなしのアクセスを行うことになり、メモリアクセスが低速になることがありました。

 

最初に実装されたアーキテクチャ

第1世代(Nehalem)

プロセッサーナンバーは3桁。例:Core i7-870

 

用途

仮想マシンを使いたい場合に有効な機能です。

Hyper-V、KVM、VirtualBox、Vmware ESXなど主要な仮想化ソフトでサポートされています。

 

AVX(Advanced Vector Extensions)

機能

MMXやSSEの後継となるSIMD命令セットです。

SSEでは128ビットのデータを同時に扱えましたが、AVXで2倍の256ビットに拡張されました。これにより、1命令で8つの単精度浮動小数点数(32ビット)演算、または4つの倍精度浮動小数点数(64ビット)演算を実行することができます。

浮動小数点数演算性能が第1世代(Nehalem)の2倍になっているそうです。

 

最初に実装されたアーキテクチャ

第2世代(Sandy Bridge)

プロセッサーナンバーは2xxx。例:Core i7-2600

 

用途

浮動小数点演算を多用する3DゲームやRAW現像、動画の編集/エンコード/デコード、AIの機械学習などに威力を発揮します。

 

RdRand命令

機能

ハードウェアで乱数を発生させる機能です。生成された乱数は疑似乱数と違って周期性を持たないため、予測することが困難になっています。

 

最初に実装されたアーキテクチャ

第3世代(Ivy Bridge)

プロセッサーナンバーは3xxx。例:Core i7-3770

 

用途

データの暗号化に用います。ソフトウェアで乱数を生成する場合と比較して非常に高速だとのこと。

セキュアなネットワーク通信に使われるOpenSSLが使用しているそうです。

 

AVX2

機能

SIMD整数演算命令が128ビットから256ビットに拡張されました。そのほかにもシフト命令やギャザー命令などの新たな命令が追加されています。

 

最初に実装されたアーキテクチャ

第4世代(Haswell)

プロセッサーナンバーは4xxx。例:Core i7-4770

 

用途

ネットで調べる限り、AVX2で高速になったという処理にRAW現像がありました。RAW現像は浮動小数点数演算を多用するものだと思っていましたが、なぜAVX2での整数演算性能強化が影響するのだろう。。と思ったらAVX2ではなく、後述のFMA3が関係していたようです。

AVX2とFMA3の有効/無効は独立しているため、別機能とみなせる模様。

AVX2を使って高速になったという具体的な例は見つけられませんでした。

 

FMA3

機能

FMA(Fused Multiply-Add)とは、積和演算を1命令で実行できる機能です。

積和演算とは、A×B+C のように乗算と加算を行う演算で、これを1命令で行えるので、乗算と加算を別々に行う場合と比較して、理論上2倍の演算性能を実現できます。

第2世代(Sandy Bridge)のAVXでは整数積和演算のみが対象でしたが、FMA3は単精度または倍精度の浮動小数点数積和演算を1命令で実行できます。

 

また、1命令で乗算と加算を行うので、演算時の丸め誤差が乗算と加算を別々にやった場合の半分で済みます。このため、演算結果の精度が高くなるというメリットもあります。

 

最初に実装されたアーキテクチャ

第4世代(Haswell)

プロセッサーナンバーは4xxx。例:Core i7-4770

 

用途

積和演算はグラフィック処理における座標変換、動画のデータ圧縮など様々なデータ処理で使用されるため、AVXと同様、かなり恩恵にあずかれそうな気がします。あくまでアプリがFMA3に対応していれば、ですが。

 

参考文献

SSE4 - Wikipedia

ストリーミングSIMD拡張命令 - Wikipedia

RdRand - Wikipedia

積和演算 - Wikipedia