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

如何利用AVX2重排数据:将5元素分组转为7元素结构体数组

AVX2优化数据写入与函数性能优化需求

一、AVX2寄存器数据重排需求

已完成部分处理流程,计划通过AVX2指令集优化数据写入操作(AVX-512版本为可选扩展,核心目标是基于AVX2实现高效处理)。

目标数据格式为以下C++结构体:

struct Data
{
    uint32_t a,b,c,d,e;
    uint32_t f, g;
};

源数据存储规则:a、b、c、d、e这5个元素以连续分组的形式存储,f、g元素则分别存储在独立的数组中。当前计划使用7个AVX2的YMM寄存器(__m256i类型)存储8个Data结构体的数据,各寄存器内的数据分布如下:

1st register: [a0,b0,c0,d0,e0, a1,b1,c1]
2nd register: [d1,e1, a2,b2,c2,d2,e2, a3]
3rd register: [b3,c3,d3,e3, a4,b4,c4,d4]
4th register: [e4, a5,b5,c5,d5,e5, a6,b6]
5th register: [c6,d6,e6, a7,b7,c7,d7,e7]
6th register: [f0,f1,f2,f3,f4,f5,f6,f7]
7th register: [g0,g1,g2,g3,g4,g5,g6,g7]

需要对这些寄存器中的数据进行重排,使得每个寄存器按顺序包含完整的abcdefg序列,例如:

  • 第一个寄存器:[a0,b0,c0,d0,e0,f0,g0,a1]
  • 第二个寄存器:[b1,c1,d1,e1,f1,g1,a2,b2]
    以此类推,最终实现数据的有序输出。

二、C++函数性能优化需求

需要优化以下C++函数的运行速度,该函数负责将输入的uint32_t数组转换为Data结构体数组:

#pragma pack(push, 1)
struct Data
{
    uint32_t a,b,c,d,e;
    uint32_t f, g;
};
#pragma pack(pop)

static const int kItemsPerIteration = 1024;

void deinterleaveData(std::vector<Data>& dataOut, const std::vector<uint32_t>& dataIn)
{
    assert(dataIn.size() == kItemsPerIteration * sizeof(Data) + 1); // + 1 for delta
    dataOut.resize(kItemsPerIteration);
    uint32_t delta = dataIn[0];
    const uint32_t* a = dataIn.data() + 1; // abcde
    const uint32_t* f = &dataIn[0] + 1 + kItemsPerIteration * 5; // f
    const uint32_t* g = &dataIn[0] + 1 + kItemsPerIteration * 6; // g
    for (auto& x : dataOut)
    {
        x.a = delta + a[0];
        x.b = delta + a[1];
        x.c = delta + a[2];
        x.d = delta + a[3];
        x.e = delta + a[4];
        x.f = *f++;
        x.g = *g++;
        a += 5;
    }
}

内容的提问来源于stack exchange,提问作者Pavel P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:27:34