首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于8086和DSP微处理器的点积

基于8086和DSP微处理器的点积
EN

Stack Overflow用户
提问于 2016-06-24 02:16:05
回答 1查看 429关注 0票数 5

我的老师在期末考试中每年都会给我们一个问题,似乎没有人给他期望的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)

  1. 采样系数和循环缓冲器列表的内存管理( 1p )
  2. 寻址指针0.5p的管理
  3. 乘法和加法操作(大小、操作数和结果的维数) 1p,循环执行以获得结果0.5p。

b)

  1. 内存的不同管理,指针1p的并行硬件管理
  2. 乘法加0.5 p型指令
  3. 并行执行的多条指令0.5p
  4. zero overhead 1p型指令循环
  5. 来自计时器的产生采样周期1p的中断请求
  6. 当前样品1p的制备
  7. 中断子例程的评估。0.5p
  8. 采样周期与中断例程执行时间的关系。0.5p

对于第一个任务,一些ideas.He给了我们一个提示,告诉我们,即使U值是12位,8086处理器也将获得16位,而这似乎是所有其他学生似乎都没有observe.For的第二项,我完全不知道。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-27 16:19:13

一些一般准则:

  • 避免使用段覆盖前缀来处理数据。在8086上,这样的前缀招致2时钟的惩罚。
  • 确保数据是对字的。当在一个奇数地址上寻址一个单词时,8086有4个时钟的惩罚。
  • 不要在CL寄存器中使用带计数的移位/旋转。一系列的单轮班/旋转要快得多。
  • 即使最终结果需要在内存中,也不要在计算中重复使用该内存。使用临时寄存器并仅在结束时传输结果。

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

代码语言:javascript
复制
    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种情况需要考虑:

  • 最佳执行时间为: 10 + (168 + 16) *7+ (168 + 4) +4= 1474时钟
  • 最坏的执行时间是: 10 + (183 + 16) *7+ (183 + 4) +4= 1594时钟

部分展开将显示5%的速度增长,而代价是不太紧凑的代码(从36字节到56字节)。

代码语言:javascript
复制
    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个时钟。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38004655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档