卷积运算

Posted tuoniao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积运算相关的知识,希望对你有一定的参考价值。

任务

使用MIPS汇编语言编写一个进行卷积运算的汇编程序(不考虑延迟槽)。

具体要求

    • 首先读取待卷积矩阵的行数m1和列数n1,然后读取卷积核的行数m2和列数n2。
    • 然后再依次读取待卷积矩阵(m1行n1列)和卷积核(m2行n2列)中的元素。
    • 卷积核的行列数分别严格小于待卷积矩阵的行列数.
    • 测试数据中0<m1, n1, m2, n2 <11
    • 输入的每个数的绝对值不超过2^10.
    • 最终输出进行卷积后的结果
    • 输出中,有m1-m2+1行,每行有n1-n2+1个数据,每个数据用空格分开。
    • 请使用syscall结束程序:
            
li $v0, 10
syscall
            
          

特别的

  • 卷积窗口的移动步长为1,且不采用填充。

样例

给出以下输入:

 

        
4
3
2
2
1
2
3
4
5
6
7
8
9
10
11
12
0
1
2
3

      

正确的输出应该是:

 

        
25 31 
43 49 
61 67 

      

提交要求

  • 请勿使用.globl main
  • 不考虑延迟槽。
  • 只需要提交.asm文件。
  • 程序的初始地址设置(Mars->Settings->Memory Configuration)为Compact,Data at Address 0

 

题解

  1 .data
  2 arr1:    .word    0:101
  3 arr2:    .word    0:101
  4 arr3:    .word    0:101
  5 space:.asciiz " "
  6 line:    .asciiz "
"
  7 
  8 .text
  9     li    $v0,5        #scanf("%d",&m1)
 10     syscall
 11     move    $t0,$v0    #t0=m1
 12     li    $v0,5        #scanf("%d",&n1)
 13     syscall    
 14     move    $t1,$v0    #t1=n1
 15     
 16     li    $v0,5        #scanf("%d",&m2)
 17     syscall
 18     move    $t2,$v0    #t2=m2
 19     li    $v0,5        #scanf("%d",&n2)
 20     syscall    
 21     move    $t3,$v0    #t3=n2
 22     
 23     move    $s0,$0
 24     move    $s1,$0
 25     move    $s2,$0    
 26 read1:mult    $s0,$t1
 27     mflo    $s2
 28     add    $s2,$s2,$s1
 29     li    $v0,5
 30     syscall
 31     move    $t4,$v0
 32     sll    $s2,$s2,2
 33     sw    $t4,arr1($s2)    #t4=a[j][j]
 34     
 35     addi    $s1,$s1,1
 36     bne    $s1,$t1,read1
 37     
 38     move    $s1,$0
 39     addi    $s0,$s0,1
 40     bne    $s0,$t0,read1
 41     
 42     move    $s0,$0
 43     move    $s1,$0
 44     move    $s2,$0
 45 read2:mult    $s0,$t3
 46     mflo    $s2
 47     add    $s2,$s2,$s1
 48     li    $v0,5
 49     syscall
 50     move    $t4,$v0
 51     sll    $s2,$s2,2
 52     sw    $t4,arr2($s2)    #t4=b[j][j]
 53     
 54     addi    $s1,$s1,1
 55     bne    $s1,$t3,read2
 56     
 57     move    $s1,$0
 58     addi    $s0,$s0,1
 59     bne    $s0,$t2,read2
 60     
 61     sub    $t4,$t0,$t2
 62     addi    $t4,$t4,1    #t4=m1-m2+1
 63     sub    $t5,$t1,$t3
 64     addi    $t5,$t5,1    #t5=n1-n2+1
 65     
 66     move    $s0,$0    #s0=i
 67 for_begin1:
 68     beq    $s0,$t4,for_end1
 69     
 70     move    $s1,$0    #s1=j
 71     for_begin2:
 72         beq    $s1,$t5,for_end2
 73         move     $s2,$0    #s2=temp
 74         
 75         move    $s3,$0    #s3=m
 76         for_begin3:
 77             beq    $s3,$t2,for_end3
 78         
 79                 move    $s4,$0    #s4=n
 80                 for_begin4:
 81                     beq    $s4,$t3,for_end4
 82                     
 83                     add    $t6,$s0,$s3    #t6=i+m
 84                     slt    $s5,$t6,$t0
 85                     beq    $s5,$0,if_end
 86                     add    $t7,$s1,$s4    #t7=j+n
 87                     slt    $s5,$t7,$t1
 88                     beq    $s5,$0,if_end
 89                     
 90                     mult    $t6,$t1
 91                     mflo    $s5
 92                     add    $s5,$s5,$t7
 93                     sll    $s5,$s5,2
 94                     lw    $s6,arr1($s5)    #s6=a[i+m][j+n]
 95                     
 96                     mult    $s3,$t3
 97                     mflo    $s5
 98                     add    $s5,$s5,$s4
 99                     sll    $s5,$s5,2
100                     lw    $s7,arr2($s5)    #s7=b[m][n]
101                     
102                     mult    $s6,$s7
103                     mflo    $s5
104                     add    $s2,$s2,$s5        
105             
106                 if_end:
107                     addi    $s4,$s4,1
108                     j    for_begin4
109                 for_end4:
110                     mult    $s0,$t5
111                     mflo    $s5
112                     add    $s5,$s5,$s1
113                     sll    $s5,$s5,2
114                     sw    $s2,arr3($s5)    #c[i][j]=temp
115         
116             addi    $s3,$s3,1
117             j    for_begin3
118         for_end3:
119             nop
120         
121         addi    $s1,$s1,1
122         j    for_begin2
123     for_end2:
124         nop
125     addi    $s0,$s0,1
126     j    for_begin1
127 for_end1:
128     nop
129     
130     move    $s0,$0
131 for_begin5:
132     beq    $s0,$t4,for_end5
133     
134     move    $s1,$0
135     for_begin6:
136         beq    $s1,$t5,for_end6
137         
138         mult    $s0,$t5
139         mflo    $s2
140         add    $s2,$s2,$s1
141         sll    $s2,$s2,2
142         lw    $a0,arr3($s2)
143         li    $v0,1
144         syscall
145         la    $a0,space
146         li    $v0,4
147         syscall    
148         
149         addi    $s1,$s1,1
150         j    for_begin6
151     for_end6:
152         la    $a0,line
153         li    $v0,4
154         syscall
155         
156     addi    $s0,$s0,1
157     j    for_begin5
158 for_end5:
159     li    $v0,10
160     syscall

 

以上是关于卷积运算的主要内容,如果未能解决你的问题,请参考以下文章

卷积运算是什么

使用NEON优化ARM的卷积运算

matlab 卷积

二维卷积运算tf.conv2d介绍

01 卷积运算张量维度问题

FWT 等总结