インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
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 ルーチンは、ハードウェア・ベクトル・レジスターを最大限に活用して引数を渡し、結果を返す、regcall 呼び出し規約を使用します。詳細は、「C/C++ の呼び出し規約」セクションと「ショートベクトル乱数ジェネレーター (SVRNG) ライブラリーの組込み関数」の _vectorcall と __regcall に関する参考文献を参照してください。これにより、不要なレジスターのスピル/フィルを回避し、パフォーマンスを向上します。
また、インテル® コンパイラー固有の "ベクトルバージョン" 宣言を利用して、オリジナルの C/C++ スカラー関数に対応するベクトルバージョンを指定できます。このベクトル関数は、ベクトル・コンテキストで呼び出すことができます。詳細は、「vector_variant」を参照してください。すべての SIMD ベクトル SVRNG 組込み関数 (長さ 1 のパックド結果を除く) は、自動ベクトル化をサポートするため、svrng.h ヘッダーファイルで vector_variant として宣言されています。