Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1148174
  • 博文数量: 173
  • 博客积分: 4048
  • 博客等级:
  • 技术积分: 2679
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 18:53
文章分类

全部博文(173)

文章存档

2018年(1)

2016年(1)

2013年(1)

2012年(118)

2011年(52)

分类: 嵌入式

2018-01-10 16:57:35

简单算法汇编实现

点击(此处)折叠或打开

  1. mov ebx,0
  2. loop:
  3. and ecx,eax,1
  4. add ebx,ecx
  5. shr eax,1
  6. jnz loop
line3和line4指令存在寄存器相关,但可以通过forward技术使指令pipe起来。line4,5,6
在多发射的cpu可以并行,算作一条指令。假设loop指令可以分支预测成功
,则所有的指令可以pipe起来,每周期执行一条指令。不考虑取指和流水线建立的时间,
总执行时间 = 32x2=64 cycle

使用专门算法:

点击(此处)折叠或打开

  1. x = x & 0x55555555 + (x>>1) & 0x55555555;
  2. x = x & 0x33333333 + (x>>2) & 0x33333333;
  3. x = x & 0x0f0f0f0f + (x>>4) & 0x0f0f0f0f;
  4. x = x & 0x00ff00ff + (x>>8) & 0x00ff00ff;
  5. x = x & 0x0000ffff + (x>>16) & 0x0000ffff;
汇编实现

点击(此处)折叠或打开

  1. and ecx,eax,0x55555555
  2. shr edx,eax,0x1
  3. and edx,0x55555555
  4. add eax,ecx,edx
每步4条指令。line1和line2可并行,line2,3,4寄存器相关,可使用定向技术pipe起来。
执行时间 = 3x5=15 cycle

FPGA实现

点击(此处)折叠或打开

  1. always@(posedge clk or negedge rstn)
  2. begin
  3. if(~rstn)
  4. dat_sum <= 'b0;
  5. else
  6. dat_sum <= datin[0] + datin[1] + ... datin[31];
  7. end
寄存器dat_sum由dat_in经加法器直接得到。
综合得到的电路为:

总执行时间 = 1 cycle


如果FPGA和CPU时钟相同,则可以得到15倍于CPU的性能。虽然FPGA的时钟频率会慢些,但也可以得到数倍于CPU的性能。







阅读(1124) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~