我的老师每年都会在决赛中给我们一个问题,似乎没有人给他预期的结果。个人我不知道如何解决这个问题。这是问题
让我们考虑一个常量数组A[a0 a1 a2 a3 a4 a5 a6 a7]
,其中每个元素是16位的自然数和实时采集的元素数组U U=[u0 u1 u2 u3 u4 u5 u6 u7]
,其中每个元素都是左对齐并以12位表示。两个向量的点积是Y=A*U^
,其中^
是转置运算符。
a)考虑连续地址处可用的所有数值,编写用于计算点积Y的指令序列。考虑每个指令的循环机器如执行时间,评估Y的执行时间。最终结果将是存储在通用寄存器中。
b)中 解释DSP微处理器硬件模块的组件,它们可以缩短Y的执行时间。
从修正的范围我可以找到:
a)
系数列表和循环缓冲区的内存管理 用于取样)1p
寻址指针的管理0.5p
乘法和加法运算(大小操作数和维度 结果)1p 用于获得结果的循环执行0.5 p。
b)中
zero overhead
1p 对于第一项任务,我有一些想法。他给了我们一个提示,告诉我们即使U值是12位,8086处理器也会获得16位,而这似乎是所有其他学生所做的事情。 #39; t似乎在观察。对于第二项我不知道。
答案 0 :(得分:4)
一些一般性指导原则:
CL
寄存器中的计数进行移位/旋转。一系列单班/旋转的速度要快得多。这是点积计算的一个版本:
xor bx, bx ;3
xor cx, cx ;3
mov si, 14 ;4
Again:
mov ax, [U + si] ;8 + EA (=9)
shr ax, 1 ;2
shr ax, 1 ;2
shr ax, 1 ;2
shr ax, 1 ;2
mul word ptr [A + si] ;124-139 + EA (=9)
add bx, ax ;3
adc cx, dx ;3
sub si, 2 ;4
jnb Again ;16 if taken, 4 if not taken
mov ax, bx ;2
mov dx, cx ;2
因为对于 U 数组"每个元素都是左对齐的并且在12位上表示"一系列的变化使价值正常化
通过从两个数组的末尾开始迭代,在循环控件上避免使用cmp
将结果移动到DX:AX似乎更自然。如果不需要将被删除。
由于mul
表现出变量执行时间,因此有两种情况需要考虑:
部分展开将显示速度增加5%,代价是不太紧凑的代码(从36字节到56字节)。
xor bx, bx ;3
xor cx, cx ;3
mov si, 10 ;4
Again:
mov ax, [U + si + 2] ;8 + EA (=9)
shr ax, 1 ;2
shr ax, 1 ;2
shr ax, 1 ;2
shr ax, 1 ;2
mul word ptr [A + si + 2] ;124-139 + EA (=9)
add bx, ax ;3
adc cx, dx ;3
mov ax, [U + si] ;8 + EA (=9)
shr ax, 1 ;2
shr ax, 1 ;2
shr ax, 1 ;2
shr ax, 1 ;2
mul word ptr [A + si] ;124-139 + EA (=9)
add bx, ax ;3
adc cx, dx ;3
sub si, 4 ;4
jnb Again ;16 if taken, 4 if not taken
mov ax, bx ;2
mov dx, cx ;2