8086上的Dot Product和DSP微处理器

时间:2016-06-24 02:16:06

标签: real-time x86-16 dot-product

我的老师每年都会在决赛中给我们一个问题,似乎没有人给他预期的结果。个人我不知道如何解决这个问题。这是问题

让我们考虑一个常量数组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)

  1. 系数列表和循环缓冲区的内存管理 用于取样)1p

  2. 寻址指针的管理0.5p

  3. 乘法和加法运算(大小操作数和维度 结果)1p 用于获得结果的循环执行0.5 p。

  4. b)中

    1. 不同的内存管理,并行硬件管理 指针1p
    2. Multiply类型的指令并添加0.5 p
    3. 并行执行的多条指令0.5 p
    4. zero overhead 1p
    5. 类型的指令循环
    6. 来自计时器的中断请求,用于生成采样周期1p
    7. 当前样本1p的采购
    8. 中断子程序的评估。 0.5P
    9. 采样周期与执行时间的关系 中断程序。 0.5P
    10. 对于第一项任务,我有一些想法。他给了我们一个提示,告诉我们即使U值是12位,8086处理器也会获得16位,而这似乎是所有其他学生所做的事情。 #39; t似乎在观察。对于第二项我不知道。

1 个答案:

答案 0 :(得分:4)

一些一般性指导原则:

  • 避免使用段覆盖前缀来处理数据。在8086这样的前缀会产生2个时钟惩罚。
  • 确保数据是字对齐的。当寻址奇数地址上的字时,8086会有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表现出变量执行时间,因此有两种情况需要考虑:

  • 最佳案例执行时间为:10 +(168 + 16)* 7 +(168 + 4)+ 4 = 1474个时钟
  • 最差情况执行时间为:10 +(183 + 16)* 7 +(183 + 4)+ 4 = 1594个时钟

部分展开将显示速度增加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
  • 最佳案例执行时间为:10 +(332 + 16)* 3 +(332 + 4)+ 4 = 1394个时钟
  • 最差情况执行时间为:10 +(362 + 16)* 3 +(362 + 4)+ 4 = 1514个时钟