【问题标题】:c++ SSE SIMD framework [closed]c ++ SSE SIMD框架[关闭]
【发布时间】:2011-06-24 14:22:05
【问题描述】:

有人知道开源 C++ x86 SIMD 内部函数库吗?

英特尔在他们的集成性能原语库中提供了我所需要的东西,但我不能使用它,因为到处都是版权。

编辑

我已经知道编译器提供的内在函数。我需要的是一个方便的界面来使用它们。

【问题讨论】:

  • 你到底需要什么功能?
  • SSE1/2 未来可能升级到 SSE3/4/AVX。 IMO 一个维护良好的库会增加对所有这些的支持
  • SSE2 和面向对象?听起来对我来说太不相关了。
  • IPP 现在包含在英特尔的 ICC 编译器中,当您在可交付成果中使用 IPP 例程时,没有版税或其他许可限制。您到底遇到了什么“版权问题”?
  • @jobs34yp:ICC 免费可用于 Linux 上的非商业用途。如果您的目标是商业用途,那么编译器的成本与您在性能关键代码上获得的好处相比可以忽略不计。

标签: c++ sse simd intrinsics


【解决方案1】:

查看libsimdpp 仅标头 C++ SIMD 包装库。

该库通过单一接口支持多个指令集:SSE2、SSE3、SSSE3、SSE4.1、AVX、AVX2、AVX512F、XOP、FMA3/4、NEON、NEONv2、Altivec。支持所有 Clang、GCC、MSVC 和 ICC。

指令集之间的任何差异都可以通过将缺少的指令实现为受支持指令的组合来解决。作为奖励,可以为多个指令集编译相同的代码,将生成的目标文件链接到单个可执行文件,并使用方便的动态调度机制来运行最适合当前处理器的实现。

【讨论】:

  • 是否仍然支持和开发 libdimdpp?
  • 我不知道,但我们选择了 1.0 版本,因为 2.0 仍处于“测试版”并且完全失望。不仅没有文档:没有办法将值加载到寄存器中(名称表明它没有这样做的函数)并且带有浮点寄存器的代码甚至无法编译。我完全不建议使用它。
  • @Sebastian 你应该看看现在处于发布候选阶段的 2.0 版本。应该有很少的错误,如果有的话,因为所有支持的配置都在不断地测试。文档也得到了显着改进。免责声明:我是图书馆的作者。
  • @Sebastian:关于你看到的问题,你有没有报告?我认为该库的使用不正确,因为它已在大型项目中使用而没有问题。话虽如此,实际的 1.0 版本确实可能存在错误,尽管大多数是特定于编译器的,因为仅对支持的所有配置排列进行了有限的测试,并且开发迅速推进。
  • 嗯,不,我没有举报他们。回想起来,在写这篇评论的时候,我一定很沮丧,我写的可能并不完全公平。然而,我们已经完成了我们的项目(为期一个学期的作业),从那时起我就没有研究过 libsimdpp。
【解决方案2】:

近年来出现了几个抽象显式 SIMD 编程的库。最重要的:

要寻找的最重要的事情是拥有一组可用的类型,这些类型可以正确抽象出给定目标的最佳可用 SIMD 寄存器和指令。而且,显然,完全可移植到不支持 SIMD 的系统。

【讨论】:

  • Vectorclass 库未获得许可许可——仅 GPL 或商业许可。
【解决方案3】:

我写了一个GLSL-style library,它将转换为近乎完美的质量 ASM 代码。

一个很常见的操作——叉积:

vec4 cross(const vec4 &a, const vec4 &b)
{
    return a.yzxw * b.zxyw - a.zxyw * b.yzxw;
}

将使用 glsl-sse2 转换为此汇编代码:

_Z5crossRK4vec4S1_:
    movaps    (%rsi), %xmm1
    movaps    (%rdx), %xmm2
    pshufd    $201, %xmm1, %xmm5
    pshufd    $210, %xmm2, %xmm0
    pshufd    $210, %xmm1, %xmm4
    pshufd    $201, %xmm2, %xmm3
    mulps     %xmm0, %xmm5
    mulps     %xmm3, %xmm4
    subps     %xmm4, %xmm5
    movaps    %xmm5, (%rdi)
    ret

请注意,该库还不完善,而且很可能存在未发现的错误,因为它仍然是新的。

【讨论】:

    【解决方案4】:

    看看AMD's SSEPlus project,可能是你的目标

    【讨论】:

    • 那里再也没有提到任何叫做 SSEPlus 的东西了。
    • @VioletGiraffe:AMD 有这种烦人的断开链接的习惯,更新了指向 sourceforge 页面的链接
    • 上次更新是2009年,稳定吗?
    • @VioletGiraffe:从技术上讲,最后一次更新是在 2008 年,因为它只打算包括 SSE,因此缺少 FMA、XOP 和 VMX 等较新的集合。在稳定性方面,它基本上只是一组庞大的包装器,所以它应该非常稳定。
    【解决方案5】:

    微软刚刚发布了新的"DirectXMath" library。它包括对 SSE2 和 NEON 内在函数的支持。文档看起来也不错。

    DirectXMath API 提供 SIMD 友好的 C++ 类型和函数 DirectX 常用的常见线性代数和图形数学运算 应用程序。该库为 Windows 提供优化版本 32 位 (x86)、Windows 64 位 (x64) 和 ARM 上的 Windows 通过 SSE2 和 Visual Studio 编译器中的 ARM-NEON 内在函数支持。

    【讨论】:

      【解决方案6】:

      Vc 是另一个实现向量类并允许编写独立于所使用的实际指令集的向量化代码的 C++ 库。

      【讨论】:

      • Vc 在 ARM 上不支持 NEON,对吗?
      【解决方案7】:

      您可能想查看macstl - 虽然它最初是为 Mac(和 PowerPC)开发的,但现在也可以在 Linux 和 x86 上运行。

      此外,如果您正在处理图像,请查看 OpenCV - 它具有针对许多常见图像处理任务的 SSE 优化例程,并具有 C 和 C++ API。

      【讨论】:

        【解决方案8】:

        【讨论】:

        • GCC 和英特尔编译器也有大部分/所有这些。
        • 我认为他在寻找的不仅仅是内在函数(我猜是某种更高级别的抽象),但不清楚究竟是什么。
        猜你喜欢
        • 2013-07-11
        • 2011-03-08
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 2021-01-04
        • 2015-07-28
        • 2013-03-21
        • 2012-02-23
        相关资源
        最近更新 更多