Core i7のSSE4.2にも対応、インテル コンパイラーで作るSSE対応プログラム

 インテル コンパイラーの特徴の1つに「自動ベクトル化」がある。これはSSE(Streaming SIMD Extensions)と呼ばれるCPUの機能を利用することで数値演算の高速化を図るものだ。インテル コンパイラーは最新のCore i7といったCPUに搭載されているSSE4.2に対応しており、現行のほとんどのインテルCPUにおいて高速化が期待できる。本記事では、インテル コンパイラーでのSSEの使用と、その効果について解説する。

 インテル コンパイラーには生成するプログラムの処理速度を向上させるためのさまざまな機能が備えられているが、その1つに「自動ベクトル化(Auto vectorization)」というものがある。これは、forループなど同一の演算を繰り返すような処理を、インテル製のCPUが持つ「SSE(Streaming SIMD Extensions)」という命令群を利用して複数のデータを一括処理することで高速化を図る機能だ。

 SSEはPentium III以降のインテル製CPUが備えている機能で、専用128ビットレジスタを使用し、複数の演算処理を一括して実行する、というものだ。この専用レジスタは32ビット環境では8本、64ビット環境では16本が利用できる。SSEを利用することで、たとえば32ビット環境では32ビットのデータを4つ、16ビットのデータなら8つを一括して処理できるようになり、処理時間の高速化が期待できる(図1)。

図1 SSEでは128ビットレジスタを利用して複数のデータを一括処理できる
図1 SSEでは128ビットレジスタを利用して複数のデータを一括処理できる

 SSEのリリース当初は70個の命令が含まれていたが、続いて2000年には新たに114個の命令を追加したSSE2が登場、以後もSSE3、SSSE3(Supplemental Streaming SIMD Extensions 3)、SSE4.1、SSE4.2と改良版がリリースされている。各CPUが対応SSEバージョンをまとめたものが表1だ。

表1 各CPUのSSE対応状況
SSE命令バージョン CPU
SSE4.2 Core i7、Xeon 55XXシリーズ
SSE4.1 Xeon 74XX、54XX、52XX、33XX、31XXシリーズ、Core 2 Extreme 9XXXシリーズ、Core 2 Quad 9XXXシリーズ、Core 2 Duo 8XXXシリーズおよびE7200
SSSE3(Supplemental Streaming SIMD Extensions 3) Xeon 73XX、72XX、53XX、51XX、32XX、30XXシリーズ、Core 2 Extreme 7XXX、6XXXシリーズ、Core 2 Quad 6XXXシリーズ、Core 2 Duo 7XXX(E7200を除く)、6XXX、5XXX、4XXXシリーズ、Core 2 Solo 2XXXシリーズ、Pentium dual-core E2XXX、T23XXシリーズ、Atomシリーズ
SSE3 Xeon 70XX、71XX、50XXシリーズ、ULV/LV版Xeon1.66、2.0、2.16、Xeon 2.8、Core Duo、Core Solo、Pentium dual-core T21XX、T20XXシリーズ、Pentium Extreme Edition、Pentium D
SSE2 上記以外のPentium 4、Xeon

 SSEには上位互換性があり、たとえばSSE4.2に対応したCPUであれば、SSSE3やSSE3、SSE2、SSEに含まれる命令すべてを利用できる。それぞれに含まれる命令の詳細についてはインテルのWebページ等を参照してほしいが、基本的な整数および単精度/倍精度浮動小数点の計算についてはSSE2でほぼカバーされており、SSE3およびSSSE3、SSE4.1、SSE4.2ではメモリからのロードや単純でない演算処理などを実行するための命令が追加されている。

 なお、インテルはSSEの後継として「Intel AVX(Advanced Vector Extensions)」という技術の開発を行っている。AVXは256ビットレジスタを利用し、これによってより多数の演算を同時実行できるようになるとのことだ。AVXを搭載したCPUは2010年以降にリリースされる見込みで、まだ市場には出回っていないものの、インテル コンパイラー 11.1ではいち早くAVXのサポートが行われている。