【问题标题】:Dot Product on 8086 and DSP microprocessor8086 和 DSP 微处理器上的点积
【发布时间】:2016-06-24 02:16:05
【问题描述】:

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

让我们考虑一个常量数组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 的执行时间。

从我能找到的校正规模:

一)

  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. 来自定时器的中断请求,用于生成采样周期 1p
  6. 当前样品1p的采购
  7. 中断子程序的评估。 0.5p
  8. 采样周期与执行时间的关系 中断例程。 0.5p

对于第一个任务,我有一些想法。他给了我们一个提示,告诉我们即使 U 值是 12 位,8086 处理器也会获取 16 位,这似乎是所有其他学生都没有的事情'似乎没有观察到。对于第二项我不知道。

【问题讨论】:

  • 你有什么问题?

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


【解决方案1】:

一些一般准则:

  • 避免使用段覆盖前缀来寻址数据。在 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 个时钟

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2015-12-16
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多