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

データ型と呼び出し規約

ショートベクトル乱数ジェネレーター (SVRNG) ライブラリー固有のデータ型

SVRNG 関数には、初期化およびサービスルーチンと生成関数の 2 種類があります。初期化およびサービスルーチンには 2 つの新しいデータ型があります。

svrng_engine_t

エンジン初期化ルーチンによって作成されるエンジン固有のデータ構造へのポインター。データ構造には、エンジンが高速に高精度の乱数ベクトルを生成するのに必要な事前計算された定数が含まれます。構造のサイズはエンジンに依存します。

svrng_distribution_t

分布初期化ルーチンによって作成される分布固有のデータ構造へのポインター。データ構造には、分布変換を効率良く実行するためのループ不変定数が含まれます。構造のサイズは、分布に依存します。

スカラー SVRNG 生成関数は、ネイティブ "C" データ型 (float、double、32 ビットおよび 64 ビット整数) を返し、SIMD ベクトルバージョンは、11、2、4、8、16 または 32 個のパックド値を 1 つまたは複数の SIMD ベクトルレジスターに格納します。SVRNG 固有ベクトル型のセットは、これらのパックド結果を返すために追加されました。これらのデータ型は CPU 固有で、プログラムを実行するアーキテクチャーに応じて、異なる数の SIMD レジスターにマップされます。

データ型 パックド値の数 インテル® SSE2 (デフォルト) インテル® AVX22 インテル® MIC インテル® AVX-512 (インテル® MIC/CPU)

符号なし 32 ビット整数

svrng_uint1_t

1

__m128i

__m128i

__m512i

__m128i

svrng_uint2_t

2

__m128i

__m128i

__m512i

__m128i

svrng_uint4_t

4

__m128i

__m128i

__m512i

__m128i

svrng_uint8_t

8

struct { __m128i r[2]; }

__m256i

__m512i

__m256i

svrng_uint16_t

16

struct { __m128i r[4]; }

struct { __m256i r[2]; }

__m512i

__m512i

svrng_uint32_t

32

struct { __m128i r[8]; }

struct { __m256i r[4]; }

struct { __m512i r[2]; }

struct { __m512i r[2]; }

符号なし 64 ビット整数

svrng_ulong1_t

1

__m128i

__m128i

__m512i

__m128i

svrng_ulong2_t

2

__m128i

__m128i

__m512i

__m128i

svrng_ulong4_t

4

struct { __m128i r[2]; }

__m256i

__m512i

__m256i

svrng_ulong8_t

8

struct { __m128i r[4]; }

struct { __m256i r[2]; }

__m512i

__m512i

svrng_ulong16_t

16

struct { __m128i r[8]; }

struct { __m256i r[4]; }

struct { __m512i r[2]; }

struct { __m512i r[2]; }

svrng_ulong32_t

32

struct { __m128i r[16]; }

struct { __m256i r[8]; }

struct { __m512i r[4]; }

struct { __m512i r[4]; }

符号付き 32 ビット整数

svrng_int1_t

1

__m128i

__m128i

__m512i

__m128i

svrng_int2_t

2

__m128i

__m128i

__m512i

__m128i

svrng_int4_t

4

__m128i

__m128i

__m512i

__m128i

svrng_int8_t

8

struct { __m128i r[2]; }

__m256i

__m512i

__m256i

svrng_int16_t

16

struct { __m128i r[4]; }

struct { __m256i r[2]; }

__m512i

__m512i

svrng_int32_t

32

struct { __m128i r[8]; }

struct { __m256i r[4]; }

struct { __m512i r[2]; }

struct { __m512i r[2]; }

単精度浮動小数点

svrng_float1_t

1

__m128

__m128

__m512

__m128

svrng_float2_t

2

__m128

__m128

__m512

__m128

svrng_float4_t

4

__m128

__m128

__m512

__m128

svrng_float8_t

8

struct { __m128 r[2]; }

__m256

__m512

__m256

svrng_float16_t

16

struct { __m128 r[4]; }

struct { __m256 r[2]; }

__m512

__m512

svrng_float32_t

32

struct { __m128 r[8]; }

struct { __m256 r[4]; }

struct { __m512 r[2]; }

struct { __m512 r[2]; }

倍精度浮動小数点

svrng_double1_t

1

__m128d

__m128d

__m512d

__m128d

svrng_double2_t

2

__m128d

__m128d

__m512d

__m128d

svrng_double4_t

4

struct { __m128d r[2]; }

__m256d

__m512d

__m256d

svrng_double8_t

8

struct { __m128d r[4]; }

struct { __m256d r[2]; }

__m512d

__m512d

svrng_double16_t

16

struct { __m128d r[8]; }

struct { __m256d r[4]; }

struct { __m512d r[2]; }

struct { __m512d r[2]; }

svrng_double32_t

32

struct { __m128d r[16]; }

struct { __m256d r[8]; }

struct { __m512d r[4]; }

struct { __m512d r[4]; }

1 1 つのパックド結果の SIMD 関数は、主に一貫性とユーザーが記述した組込み関数コードを異なる長さのセクション (長さ 1 を含む) に簡単に変換できるように、つまり 'ピーリング"、"アンロール"、"クリーンアップ" のために追加されました。

2 SVRNG は、インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 命令セット固有の最適化を含みません。インテル® AVX 対応ハードウェアでは、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) のデフォルトバージョンが呼び出されるため、インテル® SSE2 のデータ型を使用して結果を解釈する必要があります。

SVRNG 呼び出し規約

すべての SVRNG ルーチンは、ハードウェア・ベクトル・レジスターを最大限に活用して引数を渡し、結果を返す、regcall 呼び出し規約を使用します。詳細は、「C/C++ の呼び出し規約」セクションと「ショートベクトル乱数ジェネレーター (SVRNG) ライブラリーの組込み関数」の _vectorcall と __regcall に関する参考文献を参照してください。これにより、不要なレジスターのスピル/フィルを回避し、パフォーマンスを向上します。

また、インテル® コンパイラー固有の "ベクトルバージョン" 宣言を利用して、オリジナルの C/C++ スカラー関数に対応するベクトルバージョンを指定できます。このベクトル関数は、ベクトル・コンテキストで呼び出すことができます。詳細は、「vector_variant」を参照してください。すべての SIMD ベクトル SVRNG 組込み関数 (長さ 1 のパックド結果を除く) は、自動ベクトル化をサポートするため、svrng.h ヘッダーファイルで vector_variant として宣言されています。

関連情報