无论如何以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库中有它。
谢谢!
答案 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)。