如何用C++向量内联函数从256位双精度向量提取首个double值?
从256位双精度向量提取首个double值的简洁方法
针对包含4个double的256位AVX向量(__m256d类型),有两种简洁的提取首个元素的方式:
方法一:专用标量转换指令
_mm256_cvtsd_f64是AVX提供的专门用于从256位双精度向量中提取低64位元素(即第一个double)的内联函数,效率最优:
#include <immintrin.h> double extract_first(__m256d vec) { return _mm256_cvtsd_f64(vec); }
方法二:按索引提取
如果需要提取任意位置的元素,可使用_mm256_extract_pd并指定索引0,编译器会自动优化为高效指令:
#include <immintrin.h> double extract_first(__m256d vec) { return _mm256_extract_pd(vec, 0); }
编译注意事项
编译时需开启对应指令集支持:
- GCC/Clang:添加编译选项
-mavx - MSVC:添加编译选项
/arch:AVX
实验性C标准方法(C20及以上)
若使用C++20的实验性SIMD库,可直接通过下标访问首个元素,代码更直观:
#include <experimental/simd> namespace stdx = std::experimental; double extract_first(stdx::native_simd<double> vec) { return vec[0]; }
注:该特性目前属于实验阶段,不同编译器的支持程度有所差异。
内容的提问来源于stack exchange,提问作者ToxPuro
相关产品推荐
相关产品推荐

