在c#中使用SSE有可能吗?

我正在阅读有关c#代码优化的问题,一个解决方案是使用带有SSE的c ++。 是否可以直接从ac#程序进行SSE?

即将推出的Mono 2.2版本将获得SIMD支持。 Miguel de Icaza在这里写了关于即将推出的function的博客,API就在这里 。

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

更新:Mono 2.2 发布

C#可以明确地进行SSE呼叫吗?

没有.C#不能产生内联IL更少的内联x86 / amd64组件。

CLR,更具体地说是JIT,如果可以使用SSE,则在大多数情况下都不需要强制使用SSE。 我说的最多,因为我不是SSE专家,我确​​信在某些情况下它可能是有益的,JIT不会进行优化。

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

您应该使用Microsoft.Numerics.Vectors.Vector 包中的 Microsoft.Numerics.Vectors.Vector类来利用此function。 示例代码在这里 。

基于此论坛发布,如果目标计算机上有SSE,则MS JIT编译器会自动使用SSE。

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

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

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

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

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

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

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

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

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

终于有可能了。 这里的posthttp://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx

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

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

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