メインメニューを開く

差分

System.Numerics.Vector<T>

3,045 バイト追加, 2020年5月27日 (水) 02:43
ページの作成:「System.Numerics.Vector<T>はSIMDレジスタを表す不変の構造体である。 こいつを使うと.NETランタイムが上手いこと解釈してSI…」
System.Numerics.Vector<T>はSIMDレジスタを表す不変の構造体である。

こいつを使うと[[.NET]]の[[ランタイム]]が上手いこと解釈して[[SIMD]]で加速される。

なお「SIMD演算器がある場合に」と注釈があり、加速されないこともあるようなことが書いてあるが、 [[Android]]最初期の[[T-01C]]などに搭載された[[Snapdragon S1]]([[QSD8250]])ですら[[SIMD]]([[NEON]])を搭載しているわけで、 いまどき[[SIMD]]が搭載されていない[[CPU]]は存在するのか謎である。 というか、それより下のクラスの組み込み系[[CPU]]で[[.NET]]がまともに動くのか謎である。

Vector<T>はVector<T>.Countの大きさの配列のようなものである。 Vector<int>は「intが8個の配列」のような感じだ。

あとは普通に[[四則演算]]などをすると内部で[[ベクトル演算]]が行われる。

*https://docs.microsoft.com/ja-jp/dotnet/api/system.numerics.vector-1?view=netcore-3.1
<source lang="csharp">
var v1 = Vector<int>(1,2,3,4,5,6,7,8);
var v2 = Vector<int>(1,2,3,4,5,6,7,8);

// ベクトル演算が行われる
var v3 = v1 + v2;
// v3 = <2, 4, 6, 8, 10, 12, 14, 16>
</source>四則演算だけでなくVectorクラスにはMinやMaxやDotなども用意されている。

*https://docs.microsoft.com/ja-jp/dotnet/api/system.numerics.vector?view=netcore-3.1

==Vector<T>.Countプロパティ==
1つのVector<T>構造体に格納可能な変数の数を得られる。 CPUのSIMDレジスタの幅だな。<source lang="csharp">
// SIMDレジスタにintを格納できる数
var regs = Vector<int>.Count;

// intのビット数
var bits = sizeof(int) * 8;

// SIMDレジスタのビット数
var simd = bits * count;

Console.WriteLine($"{simd}bit = {bits}bit * {regs}unit");
// 256bit = 32bit * 8unit

</source>
==Vector<T>のコンストラクタ==
引数1つ指定するとVector<T>.Countの数だけ埋め尽くされる。
var v = new Vector<int>(1);
// v = <1,1,1,1,1,1,1,1>;
引数に配列を指定するとVector<T>.Countの数だけ埋め尽くされる。
var v = new Vector<int>(new[]{1,2,3,4,5,6,7,8});
// v = <1,2,3,4,5,6,7,8>;
配列の要素数がVector<T>.Countより多いと、多い分は無視される。以下だと1から8までが格納される。
var v = new Vector<int>(new[]{1,2,3,4,5,6,7,8,9,10});
// v = <1,2,3,4,5,6,7,8>;
index引数を指定すると配列のその位置から格納される。以下だと3から10までが格納される。巨大な配列を逐次処理するのに便利だな。
var v = new Vector<int>(new[]{1,2,3,4,5,6,7,8,9,10}, index:2);
v = <3,4,5,6,7,8,9,10>;
配列の要素数がVector<T>.Countより少ないと、System.IndexOutOfRangeExceptionを吐く。 巨大な配列をインデックス指定でぶん回す場合は配列の要素数がVector<T>.Countで割り切れるようにパディングするといいな。
var v = new Vector<int>(new[]{1,2,3,4,5,6,7});
// System.IndexOutOfRangeException