gxqcn 发表于 2009-2-18 11:00:28

原帖由 无心人 于 2009-2-18 10:34 发表 http://bbs.emath.ac.cn/images/common/back.gif
:)

关键是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位的初始值

gxqcn 发表于 2009-2-18 11:12:12

主要是嫌 bsr 指令周期太长(新的 CPU 已改善不少),
要不完全可以动态决定循环次数的。

无心人 发表于 2009-2-18 11:17:45

2个周期的指令还嫌长啊

无心人 发表于 2009-2-18 11:18:29

:lol

如果你是AMD的U
怎么不用shr啊

gxqcn 发表于 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


__declspec(naked)
DWORD __fastcall iSqrt_FPU1_yaos(DWORD n)
{
__asm
{
   push ecx
   sub esp, 4
   mov word ptr , 0x0E60
   fnstcw word ptr
   fldcw word ptr //提前设定截断加64位
   mov eax, ecx
   shr eax, 31
   fld qword ptr
   fild dword ptr
   faddp st(1), st
   fsqrt
   fistp dword ptr
   fldcw word ptr
   mov eax,
   add esp, 8
   ret
   }
}
继续优化, 通过测试
页: 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15
查看完整版本: 二进制32位整数快速平方根