AVX2 переупаковывание множества структур из 5 INT в 7 INT, с дополнительными элементами из других массивов? Shuffle/CombC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 AVX2 переупаковывание множества структур из 5 INT в 7 INT, с дополнительными элементами из других массивов? Shuffle/Comb

Сообщение Anonymous »

После некоторой обработки мне нужно написать свои данные, и я хотел оптимизировать их с помощью AVX2.

(версия AVX-512-это дополнительная дополнительная; работа с просто AVX2 является основной целью.) < /p>
У меня есть этот формат назначения: < /p>
struct data
{
uint32_t a, b, c, d, e;
uint32_t f;
uint32_t g;
};

В массиве источников первые 5 элементов сгруппированы, но элементы f и g отдельные.
В целом, 7 avx2 (ymm Registers/__m256i varibles). Держать 8 -код structs, но мне нужно Resshine/Plopull Combe). /> Как я планирую загрузить свои данные, первые 5 Regs содержат ABCDE < /code> упакованные данные. (Он был считан из памяти, например, ABCDeaBcDeaBcde и т. Д., ABCDE x8 раз), тогда один avx2 reg содержит fffffffff , а один avx2 reg содержит GGGGGGG .
veristers, в основном содержащий этот данных, если я загружаю 5 vector из F и g массивов:

Код: Выделить всё

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]
< /code>
Как я могу переставить их, чтобы иметь ABCDEFG < /code> в каждом регистре?
1 -й регистр: [A0, B0, C0, D0, E0, F0, G0, A1], 2 -й регистр: [B1, C1, D1, E1, F1, G1, A2, B2] и так на
В целом, цель его переставить элементы, чтобы они могли вывести их упорядоченные.  Расположение в векторах на самом деле является детализацией реализации; Другие способы достижения того же результата в памяти в порядке. < /p>

Фактический код, который я пытаюсь ускорить: < /p>
#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& dataOut, const std::vector& 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;
}
}
https://godbolt.org/z/xr3ateoo5


Подробнее здесь: https://stackoverflow.com/questions/796 ... he-extra-e
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»