败犬日报 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
就行了。