是否可以使用 SIMD 指令进行 3x3 矩阵求逆?

Posted

技术标签:

【中文标题】是否可以使用 SIMD 指令进行 3x3 矩阵求逆?【英文标题】:Is 3x3 Matrix inverse possible using SIMD instructions? 【发布时间】:2010-07-26 10:58:21 【问题描述】:

我正在使用基于 ARM Cortex-A8 的处理器,我有几个地方可以计算 3x3 矩阵逆运算。

由于 Cortex-a8 处理器有一个 NEON SIMD 处理器,我有兴趣将这个协处理器用于 3x3 矩阵求逆,我看到了几个 4x4 实现(英特尔 SSE 和 freevec),但我在哪里没有看到 3x3使用 SIMD 指令执行矩阵逆运算。 freevec 使用的方法是将 4x4 矩阵拆分为 4、2x2 矩阵,然后对每个矩阵进行微小的运算,最后将结果重新组合,得到 4x4 矩阵的逆矩阵。对于 3x3 矩阵,我看不到这样的机会。

有人知道如何使用 SIMD 指令进行 3x3 矩阵求逆,这对我很有帮助吗?

问候 维克拉姆

【问题讨论】:

也许感兴趣:“几乎没有充分的理由来反转矩阵。” johndcook.com/blog/2010/01/19/dont-invert-that-matrix 会认真对待您的评论,看看如何从我的算法中消除矩阵求逆。 @AakashM 那篇文章不相关。 John D. Cook 关于矩阵的文章是关于科学计算中使用的大矩阵。这个问题是关于小矩阵的,通常用于计算机图形学和物理模拟。反转小矩阵非常有用(而且速度非常快)。 这是一个 old Intel PDF 使用 XMMS 和另一个 ARM Blog post 矩阵乘法。由于人们有不同的需求,因此可能无法给出简明的答案;速度、代码大小、内存带宽、精度等 【参考方案1】:

您可以通过添加第 4 行和第 4 列将 3x3 矩阵扩展为 4x4 矩阵,两者均为 (0 0 0 1)。求逆后,左上角的 3x3 子矩阵将得到所需的逆。

【讨论】:

【参考方案2】:

我已经启动了一个基于 SIMD 的可移植库,用于 2x2、3x3 和 4x4 矩阵求逆:

https://github.com/niswegmann/small-matrix-inverse

很遗憾,目前还不支持 3x3(在撰写本文时)。

【讨论】:

【参考方案3】:

您可以对wikipedia 中描述的 3x3 矩阵的分析标准版本进行矢量化。应该不难。

【讨论】:

在那个版本中,请注意,行列式中使用的 3 个不同之处也在其他 9 个部分中重复使用。

以上是关于是否可以使用 SIMD 指令进行 3x3 矩阵求逆?的主要内容,如果未能解决你的问题,请参考以下文章

详细了解大量 3x3 矩阵的求逆算法

是否可以使用SIMD指令批处理相同的功能?

深入浅出计算机组成原理:SIMD:如何加速矩阵乘法?(第27讲)

内存是矩阵加法(SIMD 指令)的瓶颈吗?

是否可以使用 SIMD 指令批量处理相同的功能?

与 SIMD 内在函数进行比较和交换