【发布时间】:2014-02-26 00:12:17
【问题描述】:
我目前正在尝试在 ARM 汇编程序中实现矩阵乘法。我已经阅读了一些关于汇编程序中矩阵计算的教程,它们都在 3x3 或 4x4 浮点矩阵上使用 NEON 指令。但这与我想做的完全不同。我有两个对称的 int 矩阵,所以两个矩阵的行号和列号是相同的,我的汇编函数将矩阵的大小作为参数,所以我不能像教程中那样只为 3x3 或 4x4 矩阵编写 matMul 函数。
所以我的问题是最好和最简单的方法是什么?是否可以将 NEON 指令与 100x100 甚至更大的矩阵一起使用?而且单精度和双精度寄存器也是不必要的,因为我只有 int 数字。
另一个问题是,我对 ARM 汇编程序几乎完全陌生,所以我不完全理解 NEON 指令。
【问题讨论】:
-
您应该看看这篇博文中链接的一些教程。 cv4mar.blogspot.com/2011/06/arm-neon-basic-tutorials.html 他们似乎对一些 NEON 指令有所帮助。我需要一些时间来更全面地了解 NEON,它应该可以帮助您找到答案。
-
您还可以通过递归处理较小的(例如 4x4)块来乘以大矩阵。我不知道一个很好的链接到实现解释,但studying some of the general algorithms 将是一个开始。
-
好的,一开始听起来已经太复杂了,所以我将从简单的实现开始并使用 3 个循环。有没有办法在汇编程序中分配内存?或者我应该在 c 代码中分配它并给汇编函数 3 个参数、2 个用于矩阵相乘的指针和 1 个用于结果矩阵的指针?
-
您可以使用 NEON,但 SIMD 通常针对 3x3 或 4x4 矩阵进行优化。即,“多数据”部分一次处理 3 或 4 个值(非常适合图形等)。要将 SIMD 与更大的矩阵一起使用,您需要将其细分为更小的 4x4 操作/子矩阵。
-
感谢您的 cmets,但我无法想象如何将矩阵分成更小的矩阵。有没有人有关于该方法的描述或一些信息?