Допустим, у нас есть этот 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