【发布时间】:2014-09-09 02:28:41
【问题描述】:
我有一个 4x4 字节块,我想使用通用硬件进行转置。换句话说,对于字节 A-P,我正在寻找最有效(就指令数量而言)的方法
A B C D
E F G H
I J K L
M N O P
到
A E I M
B F J N
C G K O
D H L P
我们可以假设我在内存中有指向 A、E、I 和 M 的有效指针(这样从 A 读取 32 位将得到包含字节 ABCD 的整数)。
由于大小和数据类型的限制,这不是this question 的重复项。我的矩阵的每一行都可以放入一个 32 位整数,我正在寻找可以使用通用硬件快速执行转置的答案,类似于 SSE 宏 _MM_TRANSPOSE4_PS 的实现。
【问题讨论】:
-
如果您尝试在 C 中执行此操作而不直接写入专用向量指令,我怀疑最好直接执行此操作。转置只涉及 6 次交换(12 字节读取和 12 字节写入),并且可以高效调度。
-
了解为什么需要这样做会很有用 - 我知道的大多数矩阵处理库很少真正转置矩阵,它们只是将其标记为转置然后访问 (row, col) 改为 (col,row)。没有记忆需要移动。
-
@RogerRowland 当转置一个 16 byte 矩阵时,您可能会发现任何转置标志在重复访问时的成本都高于转置本身。
-
@RogerRowland,一个有用的字节转置示例是将四个像素从 RGBARGBARGBARGBA 转置为 RRRRGGGGBBBBAAAA。
-
@Zboson Cool,你刚刚为这个答案赢得了另一个支持:-)
标签: c++ c optimization matrix bit-manipulation