インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

インテル® Xeon Phi™ コプロセッサー x100 製品ファミリーをターゲットとするインテル® 64 アーキテクチャーでの SIMD 演算用の C++ クラスの使用

このトピックは、インテル® Xeon Phi™ コプロセッサー x100 製品ファミリー (開発コード名 Knights Corner) をターゲットとするインテル® 64 アーキテクチャーにのみ適用されます。

インテル® Xeon Phi™ コプロセッサー x100 製品ファミリー (開発コード名 Knights Corner) をターゲットとするインテル® 64 アーキテクチャーで SIMD 演算用の C++ クラスを使用する場合、配列 (ベクトルデータ) を並列処理するときに使用するのが基本です。

例として、2 つのベクトル AB の加算を考えてみます。各ベクトルは 16 の要素で構成されているとします。 整数ベクトルクラスを使用して、各配列から取り出した要素 A[i]B[i] を下の例のように加算します。

ループを使用して複数の要素を加算するときの一般的な方法


int a[16], b[16], c[16];
for (i=0; i<16; i++) /* 16 回反復が必要 */
c[i] = a[i] + b[i]; /* c[0], c[1], c[2], c[3], …, c[15] を返す */

Ivec クラスを使用して複数の要素を加算する SIMD 手法

次の例を見ると、整数ベクトルクラスを使用すれば 1 回の演算で同じ結果が得られることが分かります。


Is32vec16 ivecA, ivecB, ivec C; /*1 回反復が必要 */
ivecC = ivecA + ivecB; /* 16 の要素が格納された ivecC を返す */ 

使用できるクラス

並列処理は、通常、C++ にそれほど簡単には実装できませんが、これらの C++ クラスを使用すればそれが可能です。 以下の表は、これらのクラス・ライブラリーの詳細を示しています。

命令セット クラス 符号の有無 データ型 サイズ 要素の数 ヘッダーファイル

インテル® イニシャル・メニー・コア命令 (インテル® IMCI)

F64vec8

不定

double 64 8 micvec.h
F32vec16

不定

float 32 16 micvec.h
M512

不定

__m512 512 1 micvec.h
I64vec8

不定

long int 64 8 micvec.h
I32vec16

不定

int 32 16 micvec.h
Is32vec16

符号付き

int 32 16 micvec.h
Iu32vec16

符号なし

int 32 16 micvec.h

ほとんどのクラスは、どのデータ型についても同じような機能を持っていて、利用できるすべての組込み関数で表現されています。 ただし一部の機能については、データ型が変わるときにその機能を維持しようとするとパフォーマンスが下がる場合があるため、個々のクラスからは除外しています。 I64vec8 クラスは、論理演算とデータ操作はサポートしていますが、算術演算はサポートしていません。

即値をとるためにクラスの中に簡単に表現できない組込み関数は実装していません。

ヘッダーファイルを使用したクラスへのアクセス

必要なクラス・ヘッダー・ファイルは、コンパイラーと一緒にインクルード・ディレクトリーにインストールされます。 各クラスを有効にするときは、以下に示すように、プログラムファイルの中で #include ディレクティブを使用してください。

 #include <micvec.h>

これらのクラスは、ネイティブコードでも、通常 __MIC__ マクロで保護されている特定のターゲット専用のオフロードコードでも使用できます。

関連情報