Лучший способ транспонировать между мажорной колонкой и мажорной строкой в ​​SSE - PullRequest
0 голосов
/ 21 ноября 2019

Допустим, у нас есть этот 2d (3,4) массив, сохраненный в главном порядке строк:

0 1  2  3 | 4 5  6  7 | 8 9 10 11

Моя цель - изменить его на главный порядок столбцов:

0 4 8 | 1 5 9 | 2 6 10 | 3 7 11

-> Какой самый быстрый способ сделать это?

Что я пробовал:

  • Если матрица симметричная (NxN), я использовал _MM_TRANSPOSE4_PS от Intel.
  • Еслиматрица не симметрична (MxN, M! = N): я разработал функцию транспонирования, основанную на наборах инструкций Intel, представленных здесь: https://software.intel.com/sites/landingpage/IntrinsicsGuide/# Она показывает хорошие результаты, но когда массив действительно большой (например, 120k * 120k)* complex64) давление на PORT5 значительно возрастает, а производительность резко снижается, как описано здесь в главе 14-11 https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf
  • Также идея использования меньшего числа тасовок не очень помогла. Перемещение шаркающих под нагрузку ПОРТОВ 2,3 тоже нет.
  • Операции сбора и разброса являются очень медленными, и поэтому нет выбора

Есть какой-то трюк, о котором я не знаю: D

...