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

如何用x86 AVX2 intrinsics高效实现3D向量流加法?

AVX2优化3D向量流加法实现

首先假设你的v3结构体定义为连续的三个float:

struct v3 { float x, y, z; };

下面是符合你需求的完整实现代码,核心是将两个v3打包进256位寄存器,用单条AVX2加法指令完成运算,再解包存回:

// c <- a + b
const std::size_t loop_count = n / 2;
const std::size_t remainder = n % 2;

// 处理成对的向量
for (std::size_t i = 0; i < loop_count; ++i) {
    const std::size_t idx = i * 2;
    // 加载两个v3到128位向量(如果内存对齐,可改用_mm_load_ps)
    const __m128 a_low = _mm_loadu_ps(reinterpret_cast<const float*>(&a[idx + 1]));
    const __m128 a_high = _mm_loadu_ps(reinterpret_cast<const float*>(&a[idx]));
    const __m128 b_low = _mm_loadu_ps(reinterpret_cast<const float*>(&b[idx + 1]));
    const __m128 b_high = _mm_loadu_ps(reinterpret_cast<const float*>(&b[idx]));

    // 将两个128位向量打包成256位:高位存a[idx],低位存a[idx+1]
    const __m256 leftop_packed = _mm256_set_m128(a_low, a_high);
    const __m256 rightop_packed = _mm256_set_m128(b_low, b_high);

    // 单条AVX2加法指令完成两组向量的加法
    const __m256 result_packed = _mm256_add_ps(leftop_packed, rightop_packed);

    // 从256位结果中提取两个128位向量
    const __m128 res_high = _mm256_extractf128_ps(result_packed, 1);
    const __m128 res_low = _mm256_extractf128_ps(result_packed, 0);

    // 将结果存回对应的v3结构体
    _mm_storeu_ps(reinterpret_cast<float*>(&c[idx]), res_high);
    _mm_storeu_ps(reinterpret_cast<float*>(&c[idx + 1]), res_low);
}

// 处理剩余的单个向量(如果n为奇数)
if (remainder != 0) {
    const std::size_t idx = loop_count * 2;
    c[idx].x = a[idx].x + b[idx].x;
    c[idx].y = a[idx].y + b[idx].y;
    c[idx].z = a[idx].z + b[idx].z;
}

关键细节说明:

  • 内存加载/存储:使用_mm_loadu_ps/_mm_storeu_ps是为了兼容非对齐的内存布局,如果你的v3数组是按32字节对齐的(比如用alignas(32)修饰),可以换成_mm_load_ps/_mm_store_ps进一步提升性能。
  • 打包逻辑:_mm256_set_m128会把第一个参数放到256位寄存器的低128位,第二个参数放到高128位,刚好匹配你需求中a[i]在[255:128]、a[i+1]在[127:0]的布局。
  • 解包逻辑:_mm256_extractf128_ps的第二个参数为1时提取高128位(对应原a[i]的结果),为0时提取低128位(对应原a[i+1]的结果),直接存回即可。

内容的提问来源于stack exchange,提问作者Nitin Malapally

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:31:21