在C#中使用SSE

时间:2013-05-27 12:48:19

标签: c# sse simd

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

我的问题是,我可以在我的C#代码中调用任何其他库来使用SSE / SIMD吗?也可以在C#中使用内联汇编,所以显然我也可以使用C ++代码,即使这会导致性能损失很小,但如果有人会有一个相对易于使用的C ++库,那么这是可以接受的我想。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

C#本机支持跨平台的System.Numerics中的许多SIMD / SSE指令。点产品是受支持的说明。

过去两年来,我一直在积极开发nuget.org上的

HPCsharp nuget软件包,它使用此功能来加速许多算法。让我知道某些有用的算法是否可以通过SIMD / SSE和多核来使用加速。