【问题标题】:C# Vectorized Array AdditionC# 向量化数组加法
【发布时间】:2012-01-03 03:05:13
【问题描述】:

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

谢谢!

【问题讨论】:

  • 我认为像你写的那样简单的循环是由优化编译器向量化的。

标签: c# .net vectorization simd


【解决方案1】:

你会想看看 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;

【讨论】:

  • 仅供参考,您可以使用该程序集,但如果它在支持它们的单 CLR 中运行,它将仅使用 SIMD 指令。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    来自他们的网站:

    它以 Microsoft .Net 4.0、Mono 和 Silverlight 4 为目标,除了纯托管实施之外,还将支持本机硬件优化(MKL、ATLAS)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-29
      • 2015-09-14
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多