Intel Intrinsic:如何将交错float32数据拆分加载至两个__m128?
交错复数数据分离加载至__m128的实现方案
完全可行,利用x86架构的SSE指令集即可高效完成交错实部、虚部的分离与加载,以下是具体实现方法:
核心思路
原始数据为连续存储的交错float32序列:Real1, Imag1, Real2, Imag2, Real3, Imag3, Real4, Imag4,共8个单精度浮点数(32字节)。我们可以先将数据分为两个128位向量(各包含4个float),再通过洗牌(shuffle)指令提取出所有实部和虚部。
代码实现
#include <xmmintrin.h> // SSE头文件 // 假设原始交错数据已存储在data数组中 float data[8] = { Real1, Imag1, Real2, Imag2, Real3, Imag3, Real4, Imag4 }; // 加载前4个和后4个float到两个__m128向量 __m128 vec_low = _mm_loadu_ps(data); // 内容:[Real1, Imag1, Real2, Imag2] __m128 vec_high = _mm_loadu_ps(data + 4); // 内容:[Real3, Imag3, Real4, Imag4] // 提取所有实部到reals向量:[Real1, Real2, Real3, Real4] __m128 reals = _mm_shuffle_ps(vec_low, vec_high, _MM_SHUFFLE(2, 0, 2, 0)); // 提取所有虚部到imags向量:[Imag1, Imag2, Imag3, Imag4] __m128 imags = _mm_shuffle_ps(vec_low, vec_high, _MM_SHUFFLE(3, 1, 3, 1));
关键指令说明
_mm_loadu_ps:加载未对齐的4个float到__m128向量;若数据是16字节对齐的,可改用_mm_load_ps以获得更好性能。_mm_shuffle_ps:对两个输入__m128向量的元素进行重排,参数_MM_SHUFFLE(a,b,c,d)控制结果向量的4个元素来源:- 结果的第3位(最高位)元素取第二个输入向量的索引
a - 结果的第2位元素取第二个输入向量的索引
b - 结果的第1位元素取第一个输入向量的索引
c - 结果的第0位(最低位)元素取第一个输入向量的索引
d
- 结果的第3位(最高位)元素取第二个输入向量的索引
此方法仅需3条加载+2条洗牌指令即可完成需求,性能高效,且兼容所有支持SSE2及以上指令集的x86/x86_64 CPU。
内容的提问来源于stack exchange,提问作者Zvi Vered
相关产品推荐
相关产品推荐

