assembly - RISC-V 中的高效矩阵乘法
问题描述
我正在为 RISC-V 中的矩阵乘法而苦苦挣扎
输入是 128*128 矩阵,带有无符号短整数项
我写了一个幼稚的
目标是减少时钟周期
• 低于 20,000,000 次 (2%) • 低于 18,000,000 次 (2%) • 低于 16,000,000 次 (2%) • 低于 14,000,000 次 (2%) • 低于 12,000,000 次 (2%) • 低于 10,000,000 次 (1%) • 低于9,000,000 次 (1%) • 8,000,000 次以下 (1%) • 7,000,000 次以下 (1%) • 6,000,000 次以下 (1%)
我的是19M左右
C 中的蛮力与 O3 为 16M
我知道有更好的算法来做矩阵乘法 o(n^3)
但这里 n 只有 128,我想知道是否有其他方法可以通过 O(n^3) 算法减少周期
我能做些什么来提升我的代码吗?
.global matrix_mul
.type matrix_mul, %function
.align 2
# void matrix_mul(unsigned int A[][], unsigned int B[][], unsinged int C[][]);
matrix_mul:
# for i = 0 to 127
# for j = 0 to 127
# for k = 0 to 127
# C[i][j] += A[i][k] * B[k][j] % 1024
# insert code here
addi t0, zero, 128 # size
add s11, zero, a1 # B
add t1, zero, zero # i = 0
loop1: # loop1 #
add t2, zero, zero # j = 0
# loop2 #
loop2:
add t3, zero, zero # k = 0
add t4, zero, zero # sum = 0
# loop3 #
loop3:
lhu t5, 0(a0) # A[i][k]
lhu t6, 0(s11) # B[k][j]
mul t5, t5, t6 # A*B
add t4, t4, t5 # C += A*B
andi t4, t4, 1023 # mod 1024
addi a0, a0, 2 # A[i][k+1]
addi s11, s11, 256 # B[k+1][j]
addi t3, t3, 1 # k++
blt t3, t0, loop3 # k<size , continue
# loop3 end #
sh t4, 0(a2) # store back to C[i][j]
addi a2, a2, 2 # C[i][j+1]
addi a0, a0, -256 # A go back
addi a1, a1, 2 # B[k][j+1]
add s11, zero, a1 # B
addi t2, t2, 1 # j++
blt t2, t0, loop2 # j<size , continue
# loop2 end #
addi a0, a0, 256 # A[i+1][k]
addi a1, a1, -256 # B go back (because line 40 add 2*128=256)
add s11, zero, a1 # B
addi t1, t1, 1 # i++
blt t1, t0, loop1 # i<size , continue
# loop1 end #
# Green card here: https://www.cl.cam.ac.uk/teaching/1617/ECAD+Arch/files/docs/RISCVGreenCardv128-20151013.pdf
ret
解决方案
推荐阅读
- react-native-android - 当图像为空时如何隐藏图像的空间区域
- javascript - 如何使用 React Native 在 Android 设备上打开本机邮件,就像使用 'Linking.openURL()' iOS 完成的一样
- sql - 如果不存在,HSQLDB 将列添加到表中
- excel - 使用条件填充列表框
- csv - 从 csv 加载数据帧,丢弃所有不遵循模式的数据
- r - 使线条图上的线条在背景中透明
- powershell - 如何获取-ADDefaultDomainPasswordPassword 区分名称?
- python - 如何将 gzip 压缩的 .tsv 文件插入 PostgreSQL?
- c# - 构造函数与初始化中的 dbContext
- php - 无法再阅读 Wordpress 网站