C#矢量化阵列加法

Ale*_*ore 10 .net c# simd vectorization

无论如何以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 }
Run Code Online (Sandbox Code Playgroud)

变成这样的东西:

var e = VectorAdd(a,b,c,d);
Run Code Online (Sandbox Code Playgroud)

我知道C++/XNA库中可能存在某些东西,但我不知道我们是否在标准.Net库中有它.

谢谢!

seh*_*ehe 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;
Run Code Online (Sandbox Code Playgroud)


Ron*_*lic 5

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

在这里,我们使用P/Invoke调用C#编写的用C++编写的图像处理例程.P/Invoke有一些开销,但是如果你进行很少的调用并在本机端进行大量处理,那么它是值得的.