gpt4 book ai didi

real-time - 8086 和 DSP 微处理器上的点积

转载 作者:行者123 更新时间:2023-12-02 03:08:32 24 4
gpt4 key购买 nike

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

让我们考虑一个常量数组A[a0 a1 a2 a3 a4 a5 a6 a7],其中每个元素都是16位自然数,并且是实时获取的元素数组UU=[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.5p。

b)

  1. 内存的不同管理,并行的硬件管理指针1p
  2. 乘法和加法 0.5 p 类型的指令
  3. 并行执行的多指令 0.5 p
  4. 零开销 1p 类型的指令循环
  5. 来自定时器的中断请求,用于生成采样周期 1p
  6. 当前 sample 1p的采购
  7. 中断子程序的评估。 0.5便士
  8. 采样周期与执行时间的关系中断例程。 0.5便士

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

最佳答案

一些一般准则:

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

关于real-time - 8086 和 DSP 微处理器上的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38004655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com