ベクター拡張
CPUは多くの場合、特殊なベクトル型とベクトル演算(メディア命令と呼ばれる)をサポートしている。 演算(別名メディア命令)をサポートしている。 ベクトル型は浮動小数点数または整数型の固定配列である。 ベクトル演算はこれらに対して同時に演算を行う。
特殊化されたベクター型は、それらへのアクセスを提供する。
VectorBaseTypeは Static Arrayでなければならない。 また VectorElementTypeは静的配列の非限定要素型である。 である。 静的配列の次元は である。
core.simd
ベクトル型と演算は、以下のインポートによって導入される。 core.simd:
import core.simd;
定義された型はすべてこの命名規則に従う:
typeNNtypeはベクトル要素の型、NNはベクトル型の要素数である。 である。 型名はキーワードではない。
プロパティ
ベクター型はプロパティを持つ:
| Property | Description |
|---|---|
| .array | 静的配列表現を返す |
ベクトルは、以下のプロパティをサポートしている。 をサポートする。 生成される値は、各要素を の値である。 値である。 型である。
| Property | Description |
|---|---|
| .min | 最小値 |
| 最大値 | 最大値 |
| Property | Description |
|---|---|
| イプシロン | 値1に対する最小の増分 |
| .infinity | 無限大の値 |
| .max | 無限大でない表現可能な最大値 |
| .min_normal | 0でない表現可能な最小値 |
| .nan | NaN値 |
変換
同じサイズ(要素数 * 要素サイズ)のベクトル型は、以下のように暗黙的に変換できる。 は暗黙のうちに相互に変換できる。 これはリインタープリットキャスト(型ペイント)として行われる。 ベクトル型はVectorBaseTypeにキャストできる。
整数と浮動小数点値は、暗黙的にベクトル型に変換できる。 に暗黙的に変換できる:
int4 v = 7;
v = 3 + v; // vの各要素に3を加える
個々のベクター要素にアクセスする
個々のベクトル要素に直接アクセスすることはできないが、以下のように変換すれば可能である。 配列型に変換するとアクセスできる:
int4 v; (cast(int*)&v)[3] = 2; // 4 int ベクトルの3番目の要素を設定する (cast(int[4])v)[3] = 2; // 4 int ベクトルの3番目の要素を設定する v.array[3] = 2; // 4 int ベクトルの3番目の要素を設定する v.ptr[3] = 2; // 4 int ベクトルの3番目の要素を設定する
条件付きコンパイル
ベクター拡張が実装されている場合は バージョン識別子 D_SIMD が設定される。
型が存在するかどうかは、コンパイル時に次のようにしてテストできる。 でテストできる:
static if (is(typeNN)) ... yes, it is supported ... else ... nope, use workaround ...
型に対する特定の操作がサポートされているかどうかは、コンパイル時に次のようにテストできる。 でコンパイル時にテストできる:
float4 a,b; static if (__traits(compiles, a+b)) ... yes, add is supported for float4 ... else ... nope, use workaround ...
特定のベクター命令が使用可能かどうかの実行時テストについては の関数を参照のこと。 の関数を参照のこと。
サポートされていないベクトル演算の典型的な回避策は、代わりに配列演算を使うことである。 配列演算を使用することである:
float4 a,b; static if (__traits(compiles, a/b)) c = a / b; else c[] = a[] / b[];
X86およびX86_64ベクター拡張の実装
以下に、X86 および X86_64 アーキテクチャーの ベクトル型の具体的な実装について説明する。
ベクター拡張は現在、OS X 32ビット・ターゲットとすべての64ビット・ターゲットに実装されている。 ビット・ターゲット、およびすべての64ビット・ターゲットに実装されている。
core.simdは以下の型を定義している:
| Type Name | Description | gcc Equivalent |
|---|---|---|
| void16 | 16バイトの型なしデータ | 等価ではない |
| バイト16 | 16bytes | signed char __attribute__((vector_size(16))) |
| バイト16 | 16ubytes | unsigned char __attribute__((vector_size(16))) |
| short8 | 8shorts | short __attribute__((vector_size(16))) |
| ushort8 | 8ushorts | ushort __attribute__((vector_size(16))) |
| int4 | 4ints | int __attribute__((vector_size(16))) |
| uint4 | 4uints | unsigned __attribute__((vector_size(16))) |
| long2 | 2longs | long __attribute__((vector_size(16))) |
| ulong2 | 2ulongs | unsigned long __attribute__((vector_size(16))) |
| float4 | 4floats | float __attribute__((vector_size(16))) |
| double2 | 2doubles | double __attribute__((vector_size(16))) |
| void32 | 32バイトの型なしデータ | 等価ではない |
| バイト32 | 32bytes | signed char __attribute__((vector_size(32))) |
| バイト32 | 32ubytes | unsigned char __attribute__((vector_size(32))) |
| short16 | 16shorts | short __attribute__((vector_size(32))) |
| ushort16 | 16ushorts | ushort __attribute__((vector_size(32))) |
| int8 | 8ints | int __attribute__((vector_size(32))) |
| uint8 | 8uints | unsigned __attribute__((vector_size(32))) |
| long4 | 4longs | long __attribute__((vector_size(32))) |
| ulong4 | 4ulongs | unsigned long __attribute__((vector_size(32))) |
| float8 | 8floats | float __attribute__((vector_size(32))) |
| double4 | 4doubles | double __attribute__((vector_size(32))) |
| Operator | void16 | byte16 | ubyte16 | short8 | ushort8 | int4 | uint4 | long2 | ulong2 | float4 | double2 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| = | × | × | × | × | × | × | × | × | × | × | × |
| + | - | × | × | × | × | × | × | × | × | × | × |
| - | - | × | × | × | × | × | × | × | × | × | × |
| * | - | - | - | × | × | - | - | - | - | × | × |
| / | - | - | - | - | - | - | - | - | - | × | × |
| & | - | × | × | × | × | × | × | × | × | - | - |
| | | - | × | × | × | × | × | × | × | × | - | - |
| ^ | - | × | × | × | × | × | × | × | × | - | - |
| += | - | × | × | × | × | × | × | × | × | × | × |
| -= | - | × | × | × | × | × | × | × | × | × | × |
| *= | - | - | - | × | × | - | - | - | - | × | × |
| /= | - | - | - | - | - | - | - | - | - | × | × |
| &= | - | × | × | × | × | × | × | × | × | - | - |
| |= | - | × | × | × | × | × | × | × | × | - | - |
| ^= | - | × | × | × | × | × | × | × | × | - | - |
| == | - | × | × | × | × | × | × | × | × | × | × |
| != | - | × | × | × | × | × | × | × | × | × | × |
| < | - | × | × | × | × | × | × | × | × | × | × |
| <= | - | × | × | × | × | × | × | × | × | × | × |
| >= | - | × | × | × | × | × | × | × | × | × | × |
| > | - | × | × | × | × | × | × | × | × | × | × |
| 単項~ | - | × | × | × | × | × | × | × | × | - | - |
| 単項+ | - | × | × | × | × | × | × | × | × | × | × |
| 単数 | - | × | × | × | × | × | × | × | × | × | × |
| Operator | void32 | byte32 | ubyte32 | short16 | ushort16 | int8 | uint8 | long4 | ulong4 | float8 | double4 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| = | × | × | × | × | × | × | × | × | × | × | × |
| + | - | × | × | × | × | × | × | × | × | × | × |
| - | - | × | × | × | × | × | × | × | × | × | × |
| * | - | - | - | - | - | - | - | - | - | × | × |
| / | - | - | - | - | - | - | - | - | - | × | × |
| & | - | × | × | × | × | × | × | × | × | - | - |
| | | - | × | × | × | × | × | × | × | × | - | - |
| ^ | - | × | × | × | × | × | × | × | × | - | - |
| += | - | × | × | × | × | × | × | × | × | × | × |
| -= | - | × | × | × | × | × | × | × | × | × | × |
| *= | - | - | - | - | - | - | - | - | - | × | × |
| /= | - | - | - | - | - | - | - | - | - | × | × |
| &= | - | × | × | × | × | × | × | × | × | - | - |
| |= | - | × | × | × | × | × | × | × | × | - | - |
| ^= | - | × | × | × | × | × | × | × | × | - | - |
| == | - | × | × | × | × | × | × | × | × | × | × |
| != | - | × | × | × | × | × | × | × | × | × | × |
| < | - | × | × | × | × | × | × | × | × | × | × |
| <= | - | × | × | × | × | × | × | × | × | × | × |
| >= | - | × | × | × | × | × | × | × | × | × | × |
| > | - | × | × | × | × | × | × | × | × | × | × |
| 単項~ | - | × | × | × | × | × | × | × | × | - | - |
| 単項+ | - | × | × | × | × | × | × | × | × | × | × |
| 単数 | - | × | × | × | × | × | × | × | × | × | × |
リストにない演算子はサポートされていない。
ベクトル演算イントリンシック
サポートされている core.simdを参照のこと。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
サイト全体のドキュメントのdmdのバージョン: 2.109.1
最新のdmdのバージョン: 2.111.0 ダウンロード
翻訳日付:
HTML生成日時:
編集者: dokutoku