我的老师在期末考试中每年都会给我们一个问题,似乎没有人给他期望的result.Personally,我不知道如何解决这个问题。这就是问题所在
让我们考虑一个常数数组A[a0 a1 a2 a3 a4 a5 a6 a7],其中每个元素是16位上的自然数,以及一个实时U=[u0 u1 u2 u3 u4 u5 u6 u7]中获取的元素数组U,其中每个元素左对齐,在两个向量的12 bits.The点乘积上表示为Y=A*U^,其中^是转置算子。
( a)编写计算点积Y的指令序列,考虑到每条指令在连续addresses.Considering中可用的所有数值,循环机器的执行时间类似于执行时间,计算Y.The最终结果的执行时间将存储在通用寄存器中。
( b)说明DSP微处理器硬件块的组成,以便降低Y的执行时间。
从修正的规模我可以发现:
a)
b)
zero overhead 1p型指令循环对于第一个任务,一些ideas.He给了我们一个提示,告诉我们,即使U值是12位,8086处理器也将获得16位,而这似乎是所有其他学生似乎都没有observe.For的第二项,我完全不知道。
发布于 2016-06-27 16:19:13
一些一般准则:
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显示了可变的执行时间,因此有2种情况需要考虑:
部分展开将显示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 ;2https://stackoverflow.com/questions/38004655
复制相似问题