22

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

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

编辑

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

4

8 回答 8

24

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

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

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

于 2013-05-10T22:17:57.423 回答
12

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

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

于 2014-05-09T11:29:51.693 回答
6

我编写了一个GLSL 风格的库,它可以转换为质量接近完美的 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

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

于 2011-03-01T04:56:15.810 回答
5

看看AMD 的 SSEPlus 项目,可能是你的追求

于 2011-02-10T04:01:24.467 回答
3

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

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

于 2012-10-25T11:41:36.617 回答
2

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

于 2013-07-26T11:41:45.677 回答
1

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

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

于 2011-02-10T08:54:55.610 回答
0

哪个编译器?Visual Studio C++ 编译器支持一组 SIMD、SIMD2 和 MMX 内部函数。

于 2011-02-10T03:49:02.180 回答