|
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指令快,这是一个单独的问题,应该问,但简而言之,水平指令实际上是串行而不是并行的,并且被分成几个微操作(这就是为什么讽刺的原因
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |