2011-11-21 77 views
7

反正有人用SIMD的方式在阵列中添加元素“矢量化”吗?C#矢量化阵列添加

例如,我想谈谈:

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

它支持SIMD在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

仅供参考您可以使用该组件,但如果它在单声道CLR中运行并且支持它们,它将仅使用SIMD指令。 – redcalx

2

我想这一切都取决于你在做什么,但如果你是担心矢量化矢量总和,你可能想看看一个库,如Math.NET,它提供了优化的数值计算。

从他们的网站:

它的目标是微软.NET 4.0,单声道和Silverlight 4,并且除了纯粹的管理的实施也将支持原生硬件优化(MKL,ATLAS)。

5

Mono提供了一个相对体面的SIMD API(如上所述),但如果Mono不是一个选项,我可能会编写一个C++/CLI接口库来完成繁重的工作。对于大多数问题集,C#都能很好地工作,但是如果您开始使用高性能代码,那么最好使用能够控制性能的控制语言。

在这里我们使用P/Invoke来调用C#编写的用C++编写的图像处理例程。 P/Invoke有一些开销,但是如果你拨打很少的电话并在本地进行大量的处理,这可能是值得的。

+0

次佳,+1 – sehe