【问题标题】:variable sized int matrix in ARM assemblerARM汇编程序中的可变大小的int矩阵
【发布时间】: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,但我无法想象如何将矩阵分成更小的矩阵。有没有人有关于该方法的描述或一些信息?

标签: c assembly matrix int arm


【解决方案1】:

主程序附近

  MOV DI,OFFSET M_RESULT
  MOV SI,OFFSET M_A
  MOV BX,OFFSET M_B

返回1: MOV CH,N 子频道,线 MOV COLUMN,N

返回2:

  MOV AL,CH  
  MOV X,N
  MUL X
  ADD SI,AX
  MOV AH,0
  MOV AL,P
  ADD BX,AX
  MOV COUNTER,N 
  MOV TEMP,0

BACK3:
  MOV AL,[SI]
  MUL [BX] 
  ADD TEMP,AX
  INC SI
  ADD BX,N
DEC COUNTER
JNZ BACK3


  MOV AX,TEMP
  MOV [DI],AX
  ADD DI,2    
  MOV SI,OFFSET M_A 
  MOV BX,OFFSET M_B 
  INC P

十二月栏 JNZ BACK2

  MOV P,0

DEC LINE JNZ BACK1

;
MOV AX,4C00H   ;8- End of 
INT 21H        ;9- processing

主端 ;程序结束 CODESG 结束;段结束 结束开始;节目结束 ;作者:Mojtaba Alizadeh
INT 21H ;9- 处理 主要结束;程序结束 CODESG 结束;段结束 结束开始

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多