【问题标题】:Using SSE in C#在 C# 中使用 SSE
【发布时间】:2013-05-22 08:00:15
【问题描述】:

我目前正在用 C# 编写一个应用程序,它可以从使用 SSE 中受益匪浅,因为相对较小的一段代码会占用 90-95% 的执行时间。代码本身也非常适合 SSE(因为它是基于矩阵和向量的),所以我继续使用 Mono.Simd,尽管这在执行时间上产生了显着差异,但这仍然不够。 Mono.Simd 的问题在于它只有非常旧的 SSE 指令(我相信主要来自 SSE1 和 SSE2),这会导致点积(或标量/内积)例如占用 3 条指令,而它可以是仅在 1 条指令中使用 SSE4 实现(并且由于 SSE4 自 2006 年以来可用,因此可以安全地假设现在每台现代计算机都拥有它)。此外,根本不包括一堆其他函数(例如,获取每个数字的绝对值,这也需要一个笨拙的解决方法)。

我的问题是,我可以从我的 C# 代码中调用任何其他库来使用 SSE/SIMD 吗?也可以在 C# 中使用内联汇编,所以显然我也可以使用 C++ 代码,尽管这会导致性能下降,但如果有人有一个相对易于使用的 C++ 库和上述函数,这将是可以接受的我猜。

提前感谢您的帮助。

【问题讨论】:

  • 在 C++/CLI 中创建一个类库。您可以在使用 #pragma unmanaged 编译的代码中使用 SSEx 内在函数。但是,您将永远无法高效地执行一条 SSE4 指令,从托管代码执行切换到非托管代码执行会产生开销。大约需要 5 纳秒,加上编组参数所涉及的任何开销以及使变量与 16 对齐所需的不可避免的副本。您的本机代码必须足够大以摊销该成本。
  • “自 2006 年以来 SSE4 可用,因此可以放心地假设现在每台现代计算机都有它”- Penryn(英特尔)是 2008 年 1 月,推土机(AMD)是 2011 年 10 月。如果你不对 SSE2 进行后备时,您的代码将分别在早于 Intel 和 AMD 的这些日期的任何 CPU 上崩溃。
  • 你可以使用 opencl 包装器。

标签: c# sse simd


【解决方案1】:

开源Yeppp! library(我是其中的作者)提供了 SIMD 优化的数据处理功能,并且可以通过官方绑定从 .Net 语言中使用。它不仅支持 SSE,还支持来自即将推出的 Intel Haswell 处理器的高达 AVX2 的 SIMD 扩展。该库会自动为其运行的处理器选择最佳版本。

【讨论】:

  • 这看起来很有希望,我将如何在我的代码中使用它(我在 Mono 中使用 c#,用于统一项目,所以如果它可以在 Windows 和 Mac 上运行会很好)?是否有 dll,或者是否有可能制作一个可在 MacOS 中使用并使用所有(或大部分)优化的 dll?
  • 它在 Linux 的 Mono 下工作(显然在 Windows 的 .Net 下),但目前不支持 Mac。
  • 下载官方最新版本,在binaries目录下会找到预建文件
  • 在下一个版本(Beta 3)中也将支持 Mac OS X
  • 这个库看起来很棒,准备用我正在编码的音频引擎测试它:kvraudio.com/forum/viewtopic.php?p=5526631
【解决方案2】:

截至 2013 年 4 月,Steam Survey reports that only 64% of PCs have support for SSE4.1。换句话说,如果您假设支持 SSE4.1,您将在大约三分之一的消费类 PC 上崩溃。

我对 Mono.Simd 不熟悉,但在 Windows 上,DirectXMath 是一个不错的选择,如果您愿意编写合适的 C++/CLI 包装器的话。两者都不会利用所有最新的说明,但您可以根据需要使用intrinsics 相对轻松地补充这些说明。不过,我不确定你能否比 Mono.Simd 做得更好。

C# 中没有“内联汇编”之类的东西;如果您想使用 C++ 或 C# 中的汇编代码,则必须通过 P/Invoke 或 C++/CLI 包装器调用它。在这两者中,C++/CLI 的开销更少。

也就是说,如果您需要优化一小段代码,最好的选择可能是完全用原生 C++ 重写那段代码。

【讨论】:

  • 现在发生了很大变化 :)(谢天谢地)
【解决方案3】:

C# 在跨平台的 System.Numerics 中本机支持相当多的 SIMD/SSE 指令。点积是受支持的指令。

nuget.org 上的 HPCsharp nuget 包是我过去两年一直在积极开发的,它使用此功能来加速许多算法。让我知道某些有用的算法是否可以通过 SIMD/SSE 和多核使用加速。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2012-03-27
    • 2017-09-21
    相关资源
    最近更新 更多