Skip to content

Commit 751b9ee

Browse files
committed
Fixed matrix multiply
Also extended execution time to 20us.
1 parent 11f7ef9 commit 751b9ee

File tree

8 files changed

+327
-406
lines changed

8 files changed

+327
-406
lines changed

src/benchmarks.tcl

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ foreach program $programs {
4848
mem load -infile test-programs/$program/program.txt -format bin -filldata 0 /testbench/dut/mem/ram_block
4949

5050
# Run
51-
run 10us
51+
run 20us
5252

5353
# Save the memory and register file to files
5454
mem save -outfile results/$program/memory.txt -format bin -wordsperline 1 -noaddress /testbench/dut/mem/ram_block

src/test-programs/matrix-mult/matrix-mult.asm

-135
This file was deleted.

src/test-programs/matrix-mult/program.txt

-104
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# This program fills an n by n matrix A with Fibonacci numbers, then computes the matrix product A*A.
2+
3+
addi $4, $0, 4 # size of square matrix
4+
5+
# number of generating Fibonacci-numbers
6+
mult $4, $4
7+
mflo $16
8+
addi $10, $16, 0
9+
10+
addi $1, $0, 1 # initializing Fib(-1) = 0
11+
addi $2, $0, 1 # initializing Fib(0) = 1
12+
addi $11, $0, 2000 # initializing the beginning of Data Section address in memory
13+
addi $15, $0, 4 # word size in byte
14+
15+
loop: addi $3, $2, 0 # temp = Fib(n-1)
16+
add $2, $2, $1 # Fib(n)=Fib(n-1)+Fib(n-2)
17+
addi $1, $3, 0 # Fib(n-2)=temp=Fib(n-1)
18+
mult $10, $15 # $lo=4*$10, for word alignment
19+
mflo $12 # assume small numbers
20+
add $13, $11, $12 # Make data pointer [2000+($10)*4]
21+
sw $2, -4($13) # Mem[$10+2000-4] <-- Fib(n)
22+
addi $10, $10, -1 # loop index
23+
bne $10, $0, loop
24+
25+
# Pass matrix parameters
26+
addi $5, $11, 0
27+
addi $6, $11, 0
28+
sll $7, $16, 2
29+
add $7, $11, $7
30+
31+
jal multiply
32+
EoP: beq $0, $0, EoP # End of program (infinite loop)
33+
34+
# n = $4
35+
# &a = $5
36+
# &b = $6
37+
# &c = $7
38+
#
39+
# Pseudo-code:
40+
# for (int i = 0; i < n; ++i) {
41+
# for (int j = 0; j < n; ++j) {
42+
# c[i][j] = 0;
43+
# for (int k = 0; k < n; ++k) {
44+
# c[i][j] += a[i][k] * b[k][j];
45+
# }
46+
# }
47+
# }
48+
multiply: sll $16, $4, 2
49+
addi $8, $0, 0 # i = 0
50+
loop1: beq $8, $16, end1
51+
addi $9, $0, 0 # j = 0
52+
loop2: beq $9, $16, end2
53+
addi $10, $0, 0 # k = 0
54+
addi $11, $0, 0 # c[i][j] = 0
55+
loop3: beq $10, $16, end3
56+
57+
# Compute &a[i][k]
58+
mult $10, $4
59+
mflo $13
60+
add $12, $5, $8
61+
add $12, $12, $13
62+
63+
# Load a[i][k]
64+
lw $14, 0($12)
65+
66+
# Compute &b[k][j]
67+
mult $9, $4
68+
mflo $13
69+
add $12, $6, $10
70+
add $12, $12, $13
71+
72+
# Load b[k][j]
73+
lw $15, 0($12)
74+
75+
# c[i][j] += a[i][k] * b[k][j]
76+
mult $14, $15
77+
mflo $14
78+
add $11, $11, $14
79+
80+
# ++k
81+
addi $10, $10, 4
82+
83+
j loop3
84+
85+
# Compute &c[i][j]
86+
end3: mult $9, $4
87+
mflo $13
88+
add $12, $7, $8
89+
add $12, $12, $13
90+
91+
# Store c[i][j]
92+
sw $11, 0($12)
93+
94+
# ++j
95+
addi $9, $9, 4
96+
97+
j loop2
98+
99+
# ++i
100+
end2: addi $8, $8, 4
101+
102+
j loop1
103+
104+
end1: jr $31

0 commit comments

Comments
 (0)