![]() |
1
1
这可以从最初的帖子中理解(我第一次在SO上) efficient-4x4-matrix-vector-multiplication-with-sse-horizontal-add-and-dot-prod 。其余讨论适用于4x4矩阵。 这里有两种方法做矩阵时间向量(v=Mu,其中v和u是列向量)
第一种方法在数学课上更为熟悉,而第二种方法在SIMD计算机上更为有效。第二种方法使用矢量化数学(如numpy)。
现在让我们看看向量乘以矩阵(v=uM,其中v和u是行向量)
现在,列和行的角色已经互换,但方法2仍然是SIMD计算机上使用的有效方法。 为了在SIMD计算机上高效地进行矩阵时间矢量,矩阵应按列主顺序存储。为了在SIMD计算机上实现向量时间矩阵的有效性,矩阵应按行主要顺序存储。 据我所知,OpenGL使用列主排序和矩阵乘以向量,DirectX使用行主排序和向量乘以矩阵。 如果你有三个矩阵变换,你先按M1,然后按M2,然后按M3的顺序进行矩阵变换,矩阵乘以向量,你把它写成
使用您编写的向量时间矩阵
就效率而言,两种形式都不如另一种。这只是一个符号的问题(并且会引起混淆,这在竞争中很有用)。 需要注意的是,对于矩阵*,行主存储与列主存储无关。
如果你想知道为什么垂直SIMD指令比水平SIMD指令快,这是一个单独的问题,应该问,但简而言之,水平指令实际上是串行而不是并行的,并且被分成几个微操作(这就是为什么讽刺的原因
|
![]() |
jww avp · vec\u sld endian是否敏感? 7 年前 |
![]() |
Timmmm · Eigen的矢量化回退是如何工作的? 7 年前 |
![]() |
Green goblin · 乱序16位矢量SSE 9 年前 |
|
John · 两个8位阵列协方差的快速实现 9 年前 |
![]() |
user1235183 · 通过函数指针使用内部函数时的链接器错误 9 年前 |
![]() |
ishaan arora · 在C中将代码从SSE2转换为SSE4 9 年前 |
![]() |
Thomas · FMA指令集的硬件支持有多丰富 9 年前 |