ベクター拡張
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
翻訳日付 :
HTML生成日時:
編集者: dokutoku