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