2011-11-21 18 views
7

Czy mimo to "wektoryzować" dodawanie elementów przez tablice w stylu SIMD?C# Vectorized Array Addition

Na przykład, chciałbym, aby włączyć:

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 } 

w coś podobnego:

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

wiem coś może istnieć w bibliotekach ++/XNA C, ale nie wiem, czy mamy go w standardowych bibliotekach .Net.

Dzięki!

+0

Myślę, że proste pętle, takie jak ta, którą napisałeś, są wektoryzowane przez kompilator optymalizujący. – Tudor

Odpowiedz

13

Będziemy chcieli, aby spojrzeć na Mono.Simd:

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

Obsługuje SIMD w 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

Do Twojej dyspozycji możesz użyć zestawu, ale będzie on używał tylko instrukcji SIMD, jeśli działa w obrębie mono CLR, w którym jest obsługiwany. – redcalx

2

Myślę, że wszystko zależy od tego, co robisz, ale jeśli jesteś martwiąc się o wektorowanie sum wektorowych, możesz rzucić okiem na bibliotekę, taką jak Math.NET, która zapewnia zoptymalizowane obliczenia numeryczne.

Z ich strony internetowej:

on skierowany Microsoft .Net 4.0, Mono i Silverlight 4, a oprócz czysto zarządzanego wdrażania będzie również wspierać rodzimą optymalizację sprzętu (MKL, ATLAS).

5

Mono zapewnia względnie przyzwoity interfejs SIMD API (jak to wspomina), ale jeśli Mono nie jest opcją, prawdopodobnie napiszę bibliotekę interfejsu C++/CLI, aby wykonać podnoszenie ciężkie. C# działa całkiem dobrze w przypadku większości zestawów problemów, ale jeśli zaczynasz korzystać z kodu o wysokiej wydajności, najlepiej udać się do języka, który daje kontrolę, aby naprawdę zabrudzić wydajnością.

Tutaj w pracy używamy P/Invoke do wywoływania procedur przetwarzania obrazów napisanych w C++ z C#. P/Invoke ma trochę narzut, ale jeśli wykonasz bardzo niewiele połączeń i wykonasz dużo przetwarzania po stronie natywnej, to może być tego warte.

+0

sekunda najlepsza, +1 – sehe