使用循环展开技术的矩阵相乘程序介绍

;********multiply an array to an array*****
;*******    Written by  heiden*********
;循环展开后的矩阵相乘程序
;三个矩阵按行存储
;第一个矩阵的大小为:m*n
;第二个矩阵的大小为:n*k
;存放结果的矩阵大小为:m*k
;l 代表了第一个矩阵的当前被扫描的那行
;r4<=r  相对于result的偏移量
;r5<-l 
;r10<-i  第一个矩阵某一行的某个元素的索引
;r7<-j  第二个矩阵某一列的某个元素的索引

  .data
 
;***row of first array
;  .global m
;m: .word 5

;**column of first array and row of second array
;  .global n
;n: .word 4

;***culumn of second array
;  .global k
;k: .word 3

;**buffer of first array
  .global dat1
dat1: .space 20
;**buffer of second array
  .global dat2
dat2: .space 12
;**buffer of result
  .global result
result: .space 15


  .text
  .global main
main:
  addi r11,r0,0 ;temp
  addi r4,r0,0   ;r
  addi r5,r0,0   ;l
  addi r1,r0,5   ;m
  movi2fp f1,r1
  addi r1,r0,4
  movi2fp f2,r1   ;n
  addi r1,r0,3
  movi2fp f3,r1   ;k
 
 
line: movi2fp f4,r5  ;判断是否扫描完
  ltf f4,f1  ;l<m?
  bfpf finish
  addi r6,r0,0  ;col
column: movi2fp f4,r6
  ltf f4,f3  ;col<k
  bfpf leveladd
 
  movfp2i r1,f2 
  multu r10,r5,r1   ;i<-l*n
  addi r7,r6,0  ;mov col to j
  ;循环展开
  addi r12,r10,dat1     ;r12<-dat1[i] r13<-dat2[j]
  addi r14,r10,dat1    ;r14<-dat1[i+1]  r15<-dat2[j+4}
  addi r16,r10,dat1   ;r16<-dat1[i+2]  r17<-dat2[j+8]
  addi r18,r10,dat1   ;r18<-dat1[i+3]  r19<-dat2[j+12]
 
  lbu r12,0(r12)
  addi r14,r14,1
  addi r16,r16,2
  addi r18,r18,3
 
  addi r13,r7,dat2
  addi r15,r7,dat2
  addi r17,r7,dat2
  addi r19,r7,dat2
  lbu r13,0(r13)
  addi r15,r15,4
  addi r17,r17,8
  addi r19,r19,12
 
  ;addi r14,r10,dat1    ;r14<-dat1[i+1]  r15<-dat2[j+4}
  ;addi r14,r14,1
  lbu r14,0(r14)
  ;addi r15,r7,dat2
  ;addi r15,r15,4
  lbu r15,0(r15)
 
  ;addi r16,r10,dat1   ;r16<-dat1[i+2]  r17<-dat2[j+8]
  ;addi r16,r16,2
  lbu r16,0(r16)
  ;addi r17,r7,dat2
  ;addi r17,r17,8
  lbu r17,0(r17)
  
  ;addi r18,r10,dat1   ;r18<-dat1[i+3]  r19<-dat2[j+12]
  ;addi r18,r18,3
  lbu r18,0(r18)
  ;addi r19,r7,dat2
  ;addi r19,r19,12
  lbu r19,0(r19)
 
  multu r20,r12,r13   ;r20<-dat1[i]*dat2[j]
  multu r21,r14,r15   ;r21<-dat1[i+1]*dat2[j+4]
  multu r22,r16,r17   ;r22<-dat1[i+2]*dat2[j+8]
  multu r23,r18,r19   ;r23<-dat1[i+3]*dat2[j+12]
 
  add r24,r20,r21
  add r25,r22,r23
 
  add r26,r24,r25
 
 
 
 
  addi r1,r4,result
  sb 0(r1),r26  ;store result ??
  addi r4,r4,1
  addi r6,r6,1
  j column
leveladd:addi r5,r5,1
  j line
finish: trap 0  ;**end

   本程序实现5*4的矩阵与4*3的矩阵的相乘,使用了循环展开和指令调度技术.

 如有不对之处,还希望各位能给予指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值