gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:27:57 24 4
gpt4 key购买 nike

SSE 自 1999 年以来一直存在,它及其以下扩展是提高 C++ 程序性能的最强大工具之一。然而,没有明确使用此功能的标准化容器/算法等(我知道吗?)。是否有一个原因?是否有一个提案从未通过?

最佳答案

(parallelism TS v2)有实验支持适用于映射到常见 ISA 的 SIMD 扩展的显式短 vector SIMD 类型,但截至 2021 年 8 月,只有 GCC 实现了它。上面链接的 Cppreference 文档不完整,但在 Working Draft, Technical Specification for C++ Extensions for Parallelism, Document N4808 中涵盖了其他详细信息.该提案背后的想法是在博士项目 (2015 thesis here) 期间开发的。 GCC实现作者wrote an article在转换现有的 SSE 字符串处理算法以使用他的库的 2019 年迭代时,实现了类似的性能和更高的可读性。这是一些使用它和生成的程序集的简单代码:
乘加

#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我们确实为此生成了一个硬件融合乘加:
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
点积
点/内积可以简洁地写成:
float dot_product(const vec4f a, const vec4f b)
{
return reduce(a * b);
}
-Ofast -ffast-math -march=znver2 :
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
( Godbolt link with some more playing around )。

关于c++ - 为什么 C++ 标准库中没有 SIMD 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59373900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com