8086 和 DSP 微处理器上的点积

Dot Product on 8086 and DSP microprocessor

我的老师每年都会在期末考试时给我们出一道题,但似乎没有人给他出预期的题目result.Personally我不知道如何解决。问题来了

让我们考虑一个常量数组A[a0 a1 a2 a3 a4 a5 a6 a7],其中每个元素都是一个16位的自然数,以及一个实时获取的元素数组U U=[u0 u1 u2 u3 u4 u5 u6 u7],其中每个元素都是左对齐的并表示为两个向量的 12 bits.The 点积是 Y=A*U^,其中 ^ 是转置运算符。

a) 考虑连续 addresses.Considering 处可用的所有数值,编写用于计算点积 Y 的指令序列,对于每个指令,循环机器就像执行时间一样,评估 [= 的执行时间66=] 最终结果将存储在通用寄存器中。

b) 解释允许缩短 Y 执行时间的 DSP 微处理器硬件模块的组件。

从我能找到的修正范围:

a)

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

  2. 管理寻址指针0.5p

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

b)

  1. 内存的不同管理,并行的硬件管理 指针 1p
  2. 乘加指令类型 0.5 p
  3. 并行执行的多条指令 0.5 p
  4. zero overhead1p
  5. 类型的循环指令
  6. 来自计时器的中断请求,用于生成采样周期 1p
  7. 当前样本1p的采购
  8. 中断子程序的评价。 0.5p
  9. 采样周期与执行时间的关系 中断程序。 0.5p

对于第一个任务,我有一些 ideas.He 给了我们一个提示,告诉我们即使 U 值是 12 位,8086 处理器也会获取 16 位,这似乎是所有其他同学好像没有observe.For第二条我没头绪

一些一般准则:

  • 避免必须使用段覆盖前缀来寻址数据。在 8086 上,这样的前缀会导致 2 个时钟的损失。
  • 确保数据是字对齐的。 8086 在奇地址上寻址一个字时有 4 个时钟的惩罚。
  • 不要将 shifting/rotating 与 CL 寄存器中的计数一起使用。一系列单shifts/rotates快多了
  • 即使最终结果需要在内存中,也不要在计算中重复使用该内存。使用临时寄存器,只在最后传递结果。

这是点积计算的一个版本:

    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 数组 "each element is left aligned and is represented on 12 bits" 系列移位使值归一化。
通过从两个数组的末尾开始迭代,在循环控制上避免了 cmp
将结果移动到 DX:AX 似乎更自然。如果不需要,将被删除。

因为 mul 表现出可变的执行时间,所以有 2 种情况需要考虑:

  • 最佳情况执行时间为: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 个时钟