В некоторых случаях для этого есть библиотеки. И, в частности, есть трюки, которые вы можете играть с векторизованными данными (например, четыре 32-битных элемента в 128-битном векторе, но это также относится к четырем 8-разрядным байтам в 32-разрядном регистре), чтобы идти быстрее, чем отдельные -элементный доступ.
Для транспозиции стандартная идея заключается в том, что вы используете инструкции «shuffle», которые позволяют создавать новый вектор данных из двух существующих векторов в любом порядке. Вы работаете с блоками 4x4 входного массива. Итак, начать, у вас есть:
v0 = 1 2 3 4
v1 = 5 6 7 8
v2 = 9 A B C
v3 = D E F 0
Затем вы применяете инструкции воспроизведения в случайном порядке на первых двух векторов (чередованием их нечетные элементы, A0B0 C0D0 -> ABCD и чередованием их даже элементы, 0A0B 0C0D -> ABCD) и последние два, чтобы создать новый набор векторов с каждым 2х2 блоком транспонированным:
1 5 3 7
2 6 4 8
9 D B F
A E C 0
Наконец, вы претендуете инструкции воспроизведения в случайном порядке на нечетные пары и даже пару (комбинируя свои первые пары элементов, AB00 CD00 -> ABCD и их последние пары, 00AB 00CD -> ABCD), чтобы получить:
1 5 9 D
2 6 A E
3 7 B F
4 8 C 0
И вот, 16 элементов перенесены в восемь указаний!
Теперь, для 8-битных байтов в 32-разрядных регистрах, ARM не имеет точно команд перетасовки, но вы можете синтезировать то, что вам нужно, с помощью сдвигов и команды SEL (select), а второй набор тасов может выполнять одну команду с помощью PKHBT (верхняя половина нижнего края пакета) и инструкции PKHTB (верхняя половина нижнего индекса).
Наконец, если вы используете большой процессор ARM с векторизациями NEON, вы можете сделать что-то подобное с 16-элементными векторами на 16x16 блоках.
Может ли это быть домашнее задание? ;-) – mjv
Это не обычная матричная транспозиция - транспонированные карты '(строка, col)' to '(col, row)'. – caf
Это wowold помочь крошечный бит для того, что вы встраиваете в него. smoething с доступом к графическому процессору, можно просто использовать свои операции с точечными продуктами, например. – Pod