英語版
このページの英語版を見る

ベクター拡張

CPUは多くの場合、特殊なベクトル型とベクトル演算(メディア命令と呼ばれる)をサポートしている。 演算(別名メディア命令)をサポートしている。 ベクトル型は浮動小数点数または整数型の固定配列である。 ベクトル演算はこれらに対して同時に演算を行う。

特殊化されたベクター型は、それらへのアクセスを提供する。

VectorBaseTypeは Static Arrayでなければならない。 また VectorElementTypeは静的配列の非限定要素型である。 である。 静的配列の次元は である。

実装定義: どのベクター型がサポートされるかは、ターゲットによって異なる。 に依存する。実装は、ターゲットのハードウェアに実装されている 実装では、ターゲットのハードウェアに実装されているベクトル型と演算のみをサポートすることが期待される。
根拠: サポートされていないベクトル型や演算をエミュレートすると、パフォーマンスが低下することがある。 エミュレーションに頼るよりも、別のアルゴリズムを選択した方がよいだろう。 エミュレーションに頼るよりも、別のアルゴリズムを選択した方がよいだろう。
ベストプラクティス: の宣言を使用する。 core.simdの宣言を使用する。 の宣言を使う

core.simd

ベクトル型と演算は、以下のインポートによって導入される。 core.simd:

import core.simd;
実装定義: これらの型と操作は、コンパイラがターゲットとしているアーキテクチャーで定義されているものである。 に定義されたものである。特定のCPUファミリでベクトル型のサポートが ベクタ型のサポートが異なる場合は、追加のランタイム・チェックが必要になる。 コンパイラはランタイム・チェックを行わない。 プログラマーが行わなければならない。
実装定義: ターゲット・アーキテクチャによっては、コンパイラ・フラグ が必要な場合がある。 SIMD型のサポートを有効にする。

定義された型はすべてこの命名規則に従う:

typeNN
typeはベクトル要素の型、NNはベクトル型の要素数である。 である。 型名はキーワードではない。

プロパティ

ベクター型はプロパティを持つ:

ベクトル型のプロパティ
PropertyDescription
.array静的配列表現を返す

ベクトルは、以下のプロパティをサポートしている。 をサポートする。 生成される値は、各要素を の値である。 値である。 型である。

積分ベクトル型のプロパティ
PropertyDescription
.min最小値
最大値最大値
浮動小数点ベクトル型プロパティ
PropertyDescription
イプシロン値1に対する最小の増分
.infinity無限大の値
.max無限大でない表現可能な最大値
.min_normal0でない表現可能な最小値
.nanNaN値

変換

同じサイズ(要素数 * 要素サイズ)のベクトル型は、以下のように暗黙的に変換できる。 は暗黙のうちに相互に変換できる。 これはリインタープリットキャスト(型ペイント)として行われる。 ベクトル型は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 NameDescriptiongcc Equivalent
void1616バイトの型なしデータ等価ではない
バイト1616bytessigned char __attribute__((vector_size(16)))
バイト1616ubytesunsigned char __attribute__((vector_size(16)))
short88shortsshort __attribute__((vector_size(16)))
ushort88ushortsushort __attribute__((vector_size(16)))
int44intsint __attribute__((vector_size(16)))
uint44uintsunsigned __attribute__((vector_size(16)))
long22longslong __attribute__((vector_size(16)))
ulong22ulongsunsigned long __attribute__((vector_size(16)))
float44floatsfloat __attribute__((vector_size(16)))
double22doublesdouble __attribute__((vector_size(16)))
void3232バイトの型なしデータ等価ではない
バイト3232bytessigned char __attribute__((vector_size(32)))
バイト3232ubytesunsigned char __attribute__((vector_size(32)))
short1616shortsshort __attribute__((vector_size(32)))
ushort1616ushortsushort __attribute__((vector_size(32)))
int88intsint __attribute__((vector_size(32)))
uint88uintsunsigned __attribute__((vector_size(32)))
long44longslong __attribute__((vector_size(32)))
ulong44ulongsunsigned long __attribute__((vector_size(32)))
float88floatsfloat __attribute__((vector_size(32)))
double44doublesdouble __attribute__((vector_size(32)))
注釈:32ビットのgccとclangでは、long の代わりにlong long となる。
サポートされる128ビットベクトル演算子
Operatorvoid16byte16ubyte16short8ushort8int4uint4long2ulong2float4double2
=×××××××××××
+-××××××××××
--××××××××××
*---××----××
/---------××
&-××××××××--
|-××××××××--
^-××××××××--
+=-××××××××××
-=-××××××××××
*=---××----××
/=---------××
&=-××××××××--
|=-××××××××--
^=-××××××××--
==-××××××××××
!=-××××××××××
<-××××××××××
<=-××××××××××
>=-××××××××××
>-××××××××××
単項~-××××××××--
単項+-××××××××××
単数-××××××××××
サポートされる256ビットのベクトル演算子
Operatorvoid32byte32ubyte32short16ushort16int8uint8long4ulong4float8double4
=×××××××××××
+-××××××××××
--××××××××××
*---------××
/---------××
&-××××××××--
|-××××××××--
^-××××××××--
+=-××××××××××
-=-××××××××××
*=---------××
/=---------××
&=-××××××××--
|=-××××××××--
^=-××××××××--
==-××××××××××
!=-××××××××××
<-××××××××××
<=-××××××××××
>=-××××××××××
>-××××××××××
単項~-××××××××--
単項+-××××××××××
単数-××××××××××

リストにない演算子はサポートされていない。

ベクトル演算イントリンシック

サポートされている core.simdを参照のこと。