找回密码
 欢迎注册
楼主: 无心人

[讨论] 二进制32位整数快速平方根

[复制链接]
发表于 2009-2-18 11:00:28 | 显示全部楼层
原帖由 无心人 于 2009-2-18 10:34 发表 关键是ALU算法并不是最好的 这就是为什么Intel推SIMD的原因 也许你的算法改SSE2更快
SIMD 的妙处是将同一个128bit数据可以看做 128x1 / 64x1 / 32x4 / 8x16 如何看待取决于不同的指令。 这样可以做到多路并行的效果。 这里的ALU算法并不是最好的, 但在一定使用范围内却是最有效的。 比如,如果确知被开方数不大于 0xFFFF, 则仅需调用 8 次 SQRT_CORE 即可。 这是 FPU 等其它算法所不具备的。 当然,也可看作是 FPU 算法的精度过剩造成的, 因为实际上它是在做 64bit 数的开方。 SIMD 系列指令集也分整型指令和浮点型指令。 一般来说,整型指令比浮点型指令具有更短的周期,以及更大的吞吐率。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-18 11:02:25 | 显示全部楼层
是53Bit啊 宝宝的代码我修改了 改成肯定是64位浮点运算了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-18 11:03:46 | 显示全部楼层
你程序能不能使用一个预先得到的初始值? 根据首四位,能得到一个2位的初始值
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-18 11:12:12 | 显示全部楼层
主要是嫌 bsr 指令周期太长(新的 CPU 已改善不少), 要不完全可以动态决定循环次数的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-18 11:17:45 | 显示全部楼层
2个周期的指令还嫌长啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-18 11:18:29 | 显示全部楼层
如果你是AMD的U 怎么不用shr啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-18 11:23:37 | 显示全部楼层
你查到的是在 Core 2; 在 P4E 上得 2+16 个周期, 在 AMD K7 上得 23+9, 在 AMD K8上得 28+10, 在 AMD K7 上得 7+4。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-18 11:29:40 | 显示全部楼层
P4上是6个啊 微操作3个,6个周期延迟 P4E是16个 微操作2个,16个周期延迟 呵呵
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-18 11:32:19 | 显示全部楼层
LEA 代价也不小 P4E是2.5 P4才是0.5
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-18 11:46:27 | 显示全部楼层
  1. __declspec(naked)
  2. DWORD __fastcall iSqrt_FPU1_yaos(DWORD n)
  3. {
  4. __asm
  5. {
  6. push ecx
  7. sub esp, 4
  8. mov word ptr [esp], 0x0E60
  9. fnstcw word ptr [esp + 2]
  10. fldcw word ptr [esp] //提前设定截断加64位
  11. mov eax, ecx
  12. shr eax, 31
  13. fld qword ptr [b32 + eax * 8]
  14. fild dword ptr [esp + 4]
  15. faddp st(1), st
  16. fsqrt
  17. fistp dword ptr [esp + 4]
  18. fldcw word ptr [esp + 2]
  19. mov eax, [esp + 4]
  20. add esp, 8
  21. ret
  22. }
  23. }
复制代码
继续优化, 通过测试
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-24 08:25 , Processed in 0.024715 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表