我正在阅读有关 C# 代码优化的问题,一种解决方案是将 C++ 与 SSE 结合使用。是否可以直接从 C# 程序执行 SSE?

有帮助吗?

解决方案

即将推出的 Mono 2.2版本将获得SIMD支持。 Miguel de Icaza在博客中发布了即将推出的此处功能,API为< a href =“http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd”rel =“noreferrer”>这里。

虽然将有一个库可以支持Microsoft的.NET Windows运行时下的开发,但除非您在Mono运行时下运行代码,否则它不会具有您正在寻找的性能优势。根据您的具体情况,这可能是可行的。

更新:Mono 2.2已已发布

其他提示

C# 可以显式进行 SSE 调用吗?

不。C# 无法生成内联 IL,更不用说内联 x86/amd64 汇编了。

如果 SSE 可用,CLR(更具体地说是 JIT)将使用 SSE,从而在大多数情况下无需强制使用它。我说大部分是因为我不是 SSE 专家,而且我确信在某些情况下它可能是有益的,而 JIT 不会进行优化。

SIMD for .NET将在不久的将来推出 RyuJIT (.NET的下一代JIT编译器)。

您应该使用 Microsoft.Bcl.Simd软件包中的Microsoft.Numerics.Vectors.Vector<T>类利用此功能。示例代码此处

基于这个论坛发帖,如果SSE在目标机器上可用,MS JIT编译器会自动使用SSE。

如果你想做一件“大块”的工作,最好的办法就是用Cx +使用MMX / SSE内在函数编写它,然后制作一个非常简单的/ clr托管C ++类来包装你的功能并公开它作为.net类。然后你的代码可以像使用普通类一样使用该程序集。

有关VC内在函数的更多信息,你可以看看我多年前写的这个小小的文章。

http://msdn.microsoft.com/en-us/library /0aws1s9k.aspx

哦 - 我假设您实际上想要使用并行功能来加速某些事情。正如其他人所指出的那样 - 如果您只想以更大的块等方式移动数据,JIT已经知道如何将SSE用于那些基础知识。

菲利普是对的。我有另一个较旧的帖子显示了一个类似但更详细的例子。我实际上已经运行了这段代码,并自己修改它以证明它有效。我正在考虑在我正在工作的项目中使用这种技术,这就是为什么我要看看有什么新的东西,因为这有点旧。正如作者所暗示的,你可以在C ++中编写你想要的任何函数,编译它,然后将字节复制到你的C#中。

http://blogs.msdn.com/ b / devinj /存档/ 2005/07/12 / 438323.aspx

我想补充说,Joe的CLI C ++类也是一个好主意,但是,我不认为sse编译器标志和/ clr标志在同一个项目上是兼容的。我只是验证了:必须在单独的项目中编写高性能代码以使用SSE(/ arch:sse或/ arch:sse2)编译器标志,因为/ clr是不可用的。要做一些比在几个输入上进行简单算术更复杂的事情,我认为这是最好的方法。

最近微软发布了一个beta版SIMD矢量库( Microsoft.Bcl.Simd )用于C#,需要安装RyuJIT CTP并且只能运行Windows 8。

您也可以使用本机SSE库并从C#调用它。例如,Yeppp库,请参阅此StackOverflow答案

当然可以(更重要的问题是 - 你为什么要这样做?只需将它留给运行时;这就是它的工作)。

C#允许您将委托映射到内存地址。该内存地址可以包含原始汇编代码。您可以在 Michael Giagnocavo的博客上阅读更多内容

虽然我没有尝试过,但也许可以使用 Marshal.GetDelegateForFunctionPointer

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top