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

在c#中使用SSE有可能吗? 我正在阅读一个关于C代码优化的问题,一个解决方案是用C++与SSE相结合。是否可以直接从c#程序执行SSE?,c#,sse,C#,Sse,根据论坛帖子,如果目标机器上有SSE,MS JIT编译器将自动使用SSE。c#是否可以显式进行SSE调用? 不,C#无法生成内联IL,更不用说内联x86/amd64程序集了 CLR,更具体地说是JIT,将在SSE可用的情况下使用它,从而在大多数情况下不再需要强制使用它。我之所以这么说,是因为我不是苏格兰和南方能源公司的专家,而且我确信,在某些情况下,这可能是有益的,而JIT不会进行优化 当然可以(更重要的问题是-为什么要这样做?把它留给运行时;这是它的工作) C#允许您将委托映射到内存地址。该内

根据论坛帖子,如果目标机器上有SSE,MS JIT编译器将自动使用SSE。

c#是否可以显式进行SSE调用?

不,C#无法生成内联IL,更不用说内联x86/amd64程序集了

CLR,更具体地说是JIT,将在SSE可用的情况下使用它,从而在大多数情况下不再需要强制使用它。我之所以这么说,是因为我不是苏格兰和南方能源公司的专家,而且我确信,在某些情况下,这可能是有益的,而JIT不会进行优化

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

C#允许您将委托映射到内存地址。该内存地址可以包含原始汇编代码。你可以阅读更多关于

虽然我自己还没有尝试过,但也可以使用它。

即将发布的2.2版本将支持SIMD。Miguel de Icaza在博客中介绍了即将推出的功能,API正在发布中

尽管将有一个库支持在Microsoft的.NET Windows运行时下进行开发,但除非在Mono运行时下运行代码,否则它不会有您所期望的性能优势。这可能是可行的,取决于你的情况


更新:MUNO 2.2是

< P>如果你有一个你想要做的“块”,最好的办法是用MMX/SSE内联写C++,然后制作一个非常简单的CLR管理C++类来封装你的功能并将它作为.NET类公开。然后,您的代码可以像使用普通类一样使用该程序集

要了解更多关于VC本质的信息,你可以看看我多年前写的这首小曲


哦,我假设你真的想用并行函数来加速。正如其他人所指出的,如果您只想在更大的数据块中移动数据,那么JIT已经知道如何使用SSE进行这些基本操作。

Filip是正确的。我有另一个更老的帖子,展示了一个类似但更详细的例子。我实际上已经运行了这段代码,并亲自修改了它,以向自己证明它是有效的。我正在考虑在我正在工作的一个项目中使用这种技术,这就是为什么我希望看到什么可能是新的,因为这有点旧。正如作者所暗示的,你可以编写任何你希望在C++中的函数,编译它,然后把字节复制到你的C。

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

在不久的将来。(针对.NET的下一代JIT编译器)是此功能所必需的


您应该使用Microsoft.Numerics.Vectors.Vector中的类来利用此功能。示例代码。

最近,Microsoft发布了一个用于C#的beta SIMD向量库(),它需要安装RyuJIT CTP,并且仅适用于Windows 8


您也可以只使用本机SSE库并从C#调用它。例如,YEPP库,请参见。

它最终成为可能。这里的post

Modern C#很好地支持SIMD/SSE指令,并且使它们使用起来相当简单。并非所有指令都受支持

以下是uint[]数组的SSE.Sum()示例:

    using System.Numerics;

    private static ulong SumSseInner(this uint[] arrayToSum, int l, int r)
    {
        var sumVectorLower = new Vector<ulong>();
        var sumVectorUpper = new Vector<ulong>();
        var longLower      = new Vector<ulong>();
        var longUpper      = new Vector<ulong>();
        int sseIndexEnd = l + ((r - l + 1) / Vector<uint>.Count) * Vector<uint>.Count;
        int i;
        for (i = l; i < sseIndexEnd; i += Vector<int>.Count)
        {
            var inVector = new Vector<uint>(arrayToSum, i);
            Vector.Widen(inVector, out longLower, out longUpper);
            sumVectorLower += longLower;
            sumVectorUpper += longUpper;
        }
        ulong overallSum = 0;
        for (; i <= r; i++)
            overallSum += arrayToSum[i];
        sumVectorLower += sumVectorUpper;
        for (i = 0; i < Vector<long>.Count; i++)
            overallSum += sumVectorLower[i];
        return overallSum;
    }
使用系统数值;
专用静态ulong SumSseInner(此uint[]阵列总和,整数l,整数r)
{
var sumVectorLower=新向量();
var sumVectorUpper=新向量();
var longLower=新向量();
var longUpper=新向量();
int-sseIndexEnd=l+((r-l+1)/Vector.Count)*Vector.Count;
int i;
对于(i=l;i对于(;我有点像。它检查SSE的版本,以了解它是否可以访问一些很好的通用指令,如LZCNT、POPCNT,以及一些使用扩展寄存器移动更大内存块的指令。它不会自动并行化任何东西。你能给出JIT将在哪里使用SSE的参考和/或示例吗?有没有方法来解决这个问题是否以SSE友好的方式编写代码?@Konrad,查看David Encerio的博客。他有一些关于CLR在何处使用SSE2的详细信息。我知道这是一个旧的响应,但实际上可以在C#中执行任意程序集。您不需要不安全的,也不需要后期编译器。您需要代码权限来调用Win32 VirtualAlloc。看到了吗答案现在已经过时了,我认为;C#确实有SSE/AVX或至少是通用SIMD。不确定它是否真的公开了SSE洗牌和类似于
phminposuw
psadbw
水平操作,或者只有通用的垂直操作,比如基本类型的附加向量。运行时可能会也可能不会使用一些SSE指令,但不会o对代码进行矢量化。这意味着您缺少了可能对您很重要的显著性能提升。包括MS在内的所有人都不同意这里的“为什么会这样”——编译器/运行时无法检测到SIMD指令对您有意义的大多数情况——因此,MS的下一代运行时版本(RyuJIT)直接从C#支持开发人员指定的SIMD优化——我知道你在2009年发布了这个答案,但这是一个非常谨慎的答案,这类答案