Skip to content

败犬日报 2025-02-09

1. stdx::simd 默认使用什么指令集

cppref 上的 stdx::simd 默认模板是 simd_abi::compatible,可能会误以为是动态选择指令集。

实则不然,这个 compatible 的描述是保证兼容性。https://zh.cppreference.com/w/cpp/experimental/simd/compatible

所以大概是指最“短”的向量。

cpp
#include <experimental/simd>
namespace stdx = std::experimental;

auto simd_add(stdx::simd<float> x, stdx::simd<float> y) {
    return x + y;
}

GCC 14.2 编译参数 -std=c++23 -march=x86-64 -mavx512f -O3,这个生成的汇编是 vaddps xmm0, xmm0, xmm1,用的是 SSE 指令集。如果 stdx::native_simd 就是 AVX512。(另外试了一下 arm clang 19.1,native_simd 只有 NEON,不支持 SVE)

这点也可以在 stdlibc++ 代码里得到验证:https://github.com/gcc-mirror/gcc/blob/trunk/libstdc%2B%2B-v3/include/experimental/bits/simd.h#L2977

那么 stdx::simd 有什么用呢?可能……就是没用,我直接编译参数限制 SSE 也能有同样效果。

一般情况用 stdx::native_simd 就行了。