SSE从1999年开始出现,它及其下面的扩展是提高C++程序性能的最强大工具之一。然而,没有标准化的容器/算法等可以显式地使用这个(据我所知?)。这有什么原因吗?有没有一项从未成功过的提案?
发布于 2021-08-05 20:01:09
在(并行TS v2)中有实验支持显式短向量SIMD类型,这些类型映射到普通ISAs的SIMD扩展,但到2021年8月只有GCC实现了它。上面链接到的Cppreference是不完整的,但是在工作草案,并行C++扩展技术规范,N4808文档中还有更多的细节。这个提议背后的想法是在PhD项目(2015年论文)期间开发的。GCC实现写一篇文章的作者将现有的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
rethttps://stackoverflow.com/questions/59373900
复制相似问题