You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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条加载+2条洗牌指令即可完成需求,性能高效,且兼容所有支持SSE2及以上指令集的x86/x86_64 CPU。

内容的提问来源于stack exchange,提问作者Zvi Vered

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:28:31