C#矢量化阵列加法

时间:2011-11-21 16:11:27

标签: c# .net vectorization simd

无论如何以SIMD方式“向量化”跨数组添加元素吗?

例如,我想转:

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库中有它。

谢谢!

3 个答案:

答案 0 :(得分:13)

您需要查看Mono.Simd:

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

它支持C#中的SIMD

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;

答案 1 :(得分:5)

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

在工作中,我们使用P / Invoke从C#调用用C ++编写的图像处理例程。 P / Invoke有一些开销,但是如果你只进行很少的调用并在本机上进行大量处理,那就值得。

答案 2 :(得分:2)

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

从他们的网站:

  

它面向Microsoft .Net 4.0,Mono和Silverlight 4,除了纯托管实现外,还支持本机硬件优化(MKL,ATLAS)。