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)
系数列表和循环缓冲区的内存管理
用于抽样)1p
管理寻址指针0.5p
乘法和加法运算(大小操作数和维度
结果)1p
循环执行得到结果0.5 p.
b)
- 内存的不同管理,并行的硬件管理
指针 1p
- 乘加指令类型 0.5 p
- 并行执行的多条指令 0.5 p
zero overhead
1p 类型的循环指令
- 来自计时器的中断请求,用于生成采样周期 1p
- 当前样本1p的采购
- 中断子程序的评价。 0.5p
- 采样周期与执行时间的关系
中断程序。 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 个时钟
我的老师每年都会在期末考试时给我们出一道题,但似乎没有人给他出预期的题目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)
系数列表和循环缓冲区的内存管理 用于抽样)1p
管理寻址指针0.5p
乘法和加法运算(大小操作数和维度 结果)1p 循环执行得到结果0.5 p.
b)
- 内存的不同管理,并行的硬件管理 指针 1p
- 乘加指令类型 0.5 p
- 并行执行的多条指令 0.5 p
zero overhead
1p 类型的循环指令
- 来自计时器的中断请求,用于生成采样周期 1p
- 当前样本1p的采购
- 中断子程序的评价。 0.5p
- 采样周期与执行时间的关系 中断程序。 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 个时钟