2011-11-21 10 views
7

¿Hay alguna forma de "vectorizar" la adición de elementos en las matrices de una manera SIMD?C# Vectorized Array Addition

Por ejemplo, me gustaría convertir:

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 } 

en algo así como:

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

sé que algo pueda existir en las bibliotecas ++/XNA C, pero no sabía si lo tenemos en las bibliotecas .Net estándar.

Gracias!

+0

Creo que los bucles simples como el que escribiste están vectorizados por un compilador de optimización. – Tudor

Respuesta

13

Usted tendrá que buscar en Mono.Simd:

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

Es compatible con SIMD en 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 puede usar el ensamblaje pero solo usará las instrucciones SIMD si se está ejecutando dentro del CLR mono donde hay soporte para ellas. – redcalx

2

supongo que todo depende de lo que está haciendo, pero si usted está preocupado por la vectorización de las sumas de vectores, es posible que desee echar un vistazo a una biblioteca como Math.NET que proporciona cálculos numéricos optimizados.

Desde su página web:

Se dirige a Microsoft .Net 4.0, Mono y Silverlight 4, y además de una aplicación puramente logrado también apoyarán la optimización de hardware nativo (MKL, ATLAS).

5

Mono proporciona una API SIMD relativamente decente (como se lo menciona) pero si Mono no es una opción, probablemente escribiría una biblioteca de interfaz C++/CLI para hacer el trabajo pesado. C# funciona bastante bien para la mayoría de los conjuntos de problemas, pero si comienzas a obtener un código de alto rendimiento, es mejor ir a un lenguaje que te dé el control para realmente ensuciarte con el rendimiento.

aquí en el trabajo usamos P/Invoke para llamar a rutinas de procesamiento de imágenes escritas en C++ de C#. P/Invoke tiene algunos gastos generales, pero si hace muy pocas llamadas y procesa mucho en el lado nativo, puede valer la pena.

+0

segundo mejor, +1 – sehe