首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C++标准库中没有SIMD功能?

为什么C++标准库中没有SIMD功能?
EN

Stack Overflow用户
提问于 2019-12-17 12:03:39
回答 1查看 2.2K关注 0票数 8

SSE从1999年开始出现,它及其下面的扩展是提高C++程序性能的最强大工具之一。然而,没有标准化的容器/算法等可以显式地使用这个(据我所知?)。这有什么原因吗?有没有一项从未成功过的提案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-05 20:01:09

(并行TS v2)中有实验支持显式短向量SIMD类型,这些类型映射到普通ISAs的SIMD扩展,但到2021年8月只有GCC实现了它。上面链接到的Cppreference是不完整的,但是在工作草案,并行C++扩展技术规范,N4808文档中还有更多的细节。这个提议背后的想法是在PhD项目(2015年论文)期间开发的。GCC实现写一篇文章的作者将现有的SSE字符串处理算法转换为使用2019年迭代的他的库,实现了类似的性能和更好的可读性。下面是一些使用它和生成的程序集的简单代码:

乘加

代码语言:javascript
复制
#include <experimental/simd> // Fails on MSVC 19 and others
using vec4f = std::experimental::fixed_size_simd<float,4>;

void madd(vec4f& out, const vec4f& a, const vec4f& b)
{
    out += a * b;
}

使用-march=znver2 -Ofast -ffast-math编译,我们确实得到了一个硬件融合的乘法-添加,为此生成:

代码语言:javascript
复制
madd(std::experimental::parallelism_v2::simd<float, std::experimental::parallelism_v2::simd_abi::_Fixed<4> >&, std::experimental::parallelism_v2::simd<float, std::experimental::parallelism_v2::simd_abi::_Fixed<4> > const&, std::experimental::parallelism_v2::simd<float, std::experimental::parallelism_v2::simd_abi::_Fixed<4> > const&):
        vmovaps xmm0, XMMWORD PTR [rdx]
        vmovaps xmm1, XMMWORD PTR [rdi]
        vfmadd132ps     xmm0, xmm1, XMMWORD PTR [rsi]
        vmovaps XMMWORD PTR [rdi], xmm0
        ret

点积

圆点/内积可以写得很简洁:

代码语言:javascript
复制
float dot_product(const vec4f a, const vec4f b)
{
    return reduce(a * b);
}

-Ofast -ffast-math -march=znver2

代码语言:javascript
复制
dot_product(std::experimental::parallelism_v2::simd<float, std::experimental::parallelism_v2::simd_abi::_Fixed<4> >, std::experimental::parallelism_v2::simd<float, std::experimental::parallelism_v2::simd_abi::_Fixed<4> >):
        vmovaps xmm1, XMMWORD PTR [rsi]
        vmulps  xmm1, xmm1, XMMWORD PTR [rdi]
        vpermilps       xmm0, xmm1, 27
        vaddps  xmm0, xmm0, xmm1
        vpermilpd       xmm1, xmm0, 3
        vaddps  xmm0, xmm0, xmm1
        ret

(https://godbolt.org/z/5s1deb7de)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59373900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档