インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® Xeon Phi™ コプロセッサー x100 製品ファミリー (開発コード名 Knights Corner) をターゲットとするインテル® 64 アーキテクチャーにのみ適用されます。
インテル® Xeon Phi™ コプロセッサー x100 製品ファミリー (開発コード名 Knights Corner) をターゲットとするインテル® 64 アーキテクチャーで SIMD 演算用の C++ クラスを使用する場合、配列 (ベクトルデータ) を並列処理するときに使用するのが基本です。
例として、2 つのベクトル A と B の加算を考えてみます。各ベクトルは 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] を返す */
次の例を見ると、整数ベクトルクラスを使用すれば 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__ マクロで保護されている特定のターゲット専用のオフロードコードでも使用できます。