如何利用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
相关产品推荐
相关产品推荐

