题
我正在阅读有关 C# 代码优化的问题,一种解决方案是将 C++ 与 SSE 结合使用。是否可以直接从 C# 程序执行 SSE?
其他提示
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 。