2011-11-21 9 views
7

SIMDの方法で要素間の要素の追加を「ベクトル化」する方法はありますか?C#ベクトル化された配列の追加

例えば、Iターンしたいと思います:

var a = new[] { 1, 2, 3, 4 }; 
var b = new[] { 1, 2, 3, 4 }; 
var c = new[] { 1, 2, 3, 4 }; 
var d = new[] { 1, 2, 3, 4 }; 

var e = new int[4]; 

for (int i = 0; i < a.Length; i++) 
{ 
    e[i] = a[i] + b[i] + c[i] + d[i]; 
} 

// e should equal { 4, 8, 12, 16 } 

のようなものに:

var e = VectorAdd(a,b,c,d); 

私は何かがC++/XNAライブラリに存在する可能性が知っているが、私はかどうかを知りませんでした私たちは標準の.Netライブラリでそれを持っています。

ありがとうございます!

+0

あなたが書いたような単純なループは、最適化コンパイラによってベクトル化されていると思います。 – Tudor

答えて

13

あなたはMono.Simdを見たいと思うでしょう:

http://tirania.org/blog/archive/2008/Nov-03.html

それは私がそれすべてはあなたが何をしているかに依存思いますが、あなたがある場合はC#の

using Mono.Simd; 


//... 
var a = new Vector4f(1, 2, 3, 4); 
var b = new Vector4f(1, 2, 3, 4); 
var c = new Vector4f(1, 2, 3, 4); 
var d = new Vector4f(1, 2, 3, 4); 

var e = a+b+c+d; 
+0

FYIアセンブリを使用することはできますが、サポートされているモノCLR内で実行されている場合にのみSIMD命令が使用されます。 – redcalx

2

でSIMDをサポートしていますベクトル和をベクトル化することを心配している場合は、Math.NETなどの最適化された数値計算を提供するライブラリを調べることをお勧めします。彼らのウェブサイトから

これは、Microsoft .NET 4.0、モノとSilverlight 4をターゲットにし、純粋に管理の実装に加えて、ネイティブなハードウェアの最適化(MKL、ATLAS)をサポートします。

5

Monoは比較的まともなSIMD APIを提供していますが、Monoがオプションでない場合は、おそらくC++/CLIインターフェイスライブラリを使って重い作業をするでしょう。 C#はほとんどの問題セットでうまく機能しますが、高性能なコードを作成するには、実際にパフォーマンスが低下するようなコントロールを提供する言語を使用することをお勧めします。

ここで、私たちはP/Invokeを使用して、C#で書かれた画像処理ルーチンをC#から呼び出します。 P/Invokeにはいくつかのオーバーヘッドがありますが、ごく少数の呼び出しを行い、ネイティブ側で多くの処理を行うと、その価値があります。

+0

第2位、+1 – sehe

関連する問題