Я работаю над структурой данных, где у меня есть массив из 16 uint64. Они раскладывают, как это в памяти (каждый ниже, представляющий одну int64):Оптимальный алгоритм SIMD для поворота или транспонирования массива
A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3 D0 D1 D2 D3
Желаемый результат состоит в переносе массива в этом:
A0 B0 C0 D0 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3
Вращение массива 90 градусов также является приемлемым решением для будущего цикла:
D0 C0 B0 A0 D1 C1 B1 A1 D2 C2 B2 A2 D3 C3 B3 A3
мне это нужно для того, чтобы работать на стрелке быстро на более позднем этапе (Траверса его последовательно с другой поездкой SIMD, 4 за один раз).
До сих пор я пытался «скомпоновать» данные, загружая 4-х битный вектор A, битмаскизируя и перетасовывая элементы и OR'ing его с помощью B и т. Д., А затем повторяя это для C ... К сожалению, это 5 x 4 SIMD инструкций на сегмент из 4 элементов в массиве (одна загрузка, одна маска, одна тасовка, одна или со следующим элементом и, наконец, хранилище). Кажется, я смогу сделать лучше.
У меня есть AVX2, и я компилирую с clang.
'C1 C1' - это опечатка? Отобразите правильный результат. – 2501
К сожалению, опечатка ... Да, я хочу перенести матрицу (поверните ее на 90 градусов) –
Позвольте мне посмотреть, понимаю ли я ваш вопрос. Вы хотите перенести 4x4-матрицу uint64? –