简单算法汇编实现
-
mov ebx,0
-
loop:
-
and ecx,eax,1
-
add ebx,ecx
-
shr eax,1
-
jnz loop
line3和line4指令存在寄存器相关,但可以通过forward技术使指令pipe起来。line4,5,6
在多发射的cpu可以并行,算作一条指令。假设loop指令可以分支预测成功
,则所有的指令可以pipe起来,每周期执行一条指令。不考虑取指和流水线建立的时间,
总执行时间 = 32x2=64 cycle
使用专门算法:
-
x = x & 0x55555555 + (x>>1) & 0x55555555;
-
x = x & 0x33333333 + (x>>2) & 0x33333333;
-
x = x & 0x0f0f0f0f + (x>>4) & 0x0f0f0f0f;
-
x = x & 0x00ff00ff + (x>>8) & 0x00ff00ff;
-
x = x & 0x0000ffff + (x>>16) & 0x0000ffff;
汇编实现
-
and ecx,eax,0x55555555
-
shr edx,eax,0x1
-
and edx,0x55555555
-
add eax,ecx,edx
每步4条指令。line1和line2可并行,line2,3,4寄存器相关,可使用定向技术pipe起来。
执行时间 = 3x5=15 cycle
FPGA实现
-
always@(posedge clk or negedge rstn)
-
begin
-
if(~rstn)
-
dat_sum <= 'b0;
-
else
-
dat_sum <= datin[0] + datin[1] + ... datin[31];
-
end
寄存器dat_sum由dat_in经加法器直接得到。
综合得到的电路为:
总执行时间 = 1 cycle
如果FPGA和CPU时钟相同,则可以得到15倍于CPU的性能。虽然FPGA的时钟频率会慢些,但也可以得到数倍于CPU的性能。
阅读(1183) | 评论(0) | 转发(0) |