4

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

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

提前感谢您的帮助。

4

3 回答 3

12

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

于 2013-05-31T02:44:14.830 回答
2

As of April 2013, Steam Survey reports that only 64% of PCs have support for SSE4.1. In other words, if you assume SSE4.1 support, you'll crash on about a third of all consumer PCs.

I am not familiar with Mono.Simd, but a good alternative on Windows is DirectXMath, if you can be bothered to write a suitable C++/CLI wrapper. Neither will take advantage of all the latest instructions, but you can supplement these on a need-to basis relatively easily with intrinsics. I'm not sure you'll be able to do significantly better than Mono.Simd with it though.

There is no such thing as "inline assembly" in C#; if you want to use C++ or assembly code from C#, you'll have to call it via P/Invoke or a C++/CLI wrapper. Out of the two, C++/CLI has less overhead.

That said, if you need to optimize the hell out of a small piece of code, the best option might be to rewrite that piece of code entirely in native C++.

于 2013-05-27T18:01:23.993 回答
1

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

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

于 2019-07-29T02:12:09.707 回答