liangbch 发表于 2008-5-7 10:19:29

B计划之基本函数性能预览

很好的总结 本帖将给出一些关于大数运算基本函数的性能,主要包括 清零,内存拷贝,大数加,大数减,大数求补。
   1)除了明确指出外,所有函数都是我自己编写的。
   2)限于条件,本帖只给出这些函数在 PIV2.6G,和 PM 1.7G 两台电脑的运行结果。如果没有特别指明,编译器为VC6.0.
   3)本文中的大数 均使用 2进制,内部表示为用一个DWORD表示30bit,及2^30进制。

liangbch 发表于 2008-5-7 10:20:16

B计划之 清零函数 性能预览,老规矩,先给出性能数据,再做分析。

以下单位均为毫秒

在PIV 2.6G 电脑上的运行结果
length
address
memset
A_Clean
A_Clean_R8
A_Clear_With_SSE2
yaos_AsmMemZero0
A_Clear_With_MMX
8192
32X+0
0.002813
0.002838
0.006331
0.002780
0.002787
0.003576
8192
32X+4
0.006320
0.004643
0.005934
0.002782
0.002788
0.003589
8192
32X+8
0.004002
0.003662
0.006135
0.002783
0.002784
0.003579
8192
32X+12
0.006317
0.003025
0.006114
0.002778
0.002801
0.003575
8192
32X+16
0.003084
0.002981
0.006308
0.002790
0.002789
0.003574
8192
32X+20
0.006321
0.003660
0.006328
0.002786
0.002788
0.003597
8192
32X+24
0.003822
0.003756
0.006054
0.002779
0.002790
0.003569
8192
32X+28
0.006319
0.002849
0.006325
0.002784
0.002789
0.003586

在PM 1.7G 电脑上的运行结果
length
address
memset
A_Clean
A_Clean_R8
A_Clear_With_SSE2
yaos_AsmMemZero0
A_Clear_With_MMX
8192
32X+0
0.010836
0.003831
0.004989
0.002525
0.002522
0.002526
8192
32X+4
0.014492
0.003846
0.004960
0.002539
0.002556
0.002593
8192
32X+8
0.003825
0.003833
0.004943
0.002615
0.002554
0.002567
8192
32X+12
0.014496
0.003850
0.004948
0.002567
0.002569
0.002607
8192
32X+16
0.003825
0.003834
0.004946
0.002655
0.002632
0.002669
8192
32X+20
0.014493
0.003849
0.004970
0.002680
0.002631
0.002690
8192
32X+24
0.003825
0.003833
0.004971
0.002649
0.002631
0.002675
8192
32X+28
0.014489
0.003851
0.005002
0.002678
0.002630
0.002691

1.长度的单位为DWORD,8192表示 8192*sizeof(DWORD)=32768 byte,时间单位为毫秒
1.长度的单位为DWORD,8192表示 8192*sizeof(DWORD)=32768 byte,时间单位为毫秒
2。函数说明:
2.1)memset使用C库函数memset实现。
2.2)A_Clean 使用rep stosd 指令实现,代码最为简单
2.3)A_Clean_R8 使用MOV指令实现,使用8路展开,每个循环步处理 8个DWORD
2.4)A_Clear_With_SSE2 使用SSE2指令movdqa实现。
2.5)yaos_AsmMemZero0,和A_Clear_With_SSE2 同,由无心人编写。
2.6) A_Clear_With_MMX,使用movq 和 64bit MMX寄存器实现。
2.7)这些函数原形完全相同,为 void name(DWORD*a,size_t len) 形式。


3。性能分析
   3.1)在PIVCPU, 总体所来,这几者的速度关系为 A_Clear_With_SSE2=AsmMemZero0 >A_Clean= A_Clear_With_MMX >memset>A_clear_R8。
   SSE2指令的版本最快,2个SSE2指令的版本,性能基本相同,>A_Clean和 A_Clear_With_MMX互有胜负.

   3.2)在PM CPU,对于memeset,地址为8X+0时,速度很快,但当地址为8X+4时,速度仅为8X+0的二分之一。
当地址为8X+0时,总体说来,这几者的关系为 A_Clear_With_SSE2=AsmMemZero0>memset>A_clean> A_Clear_With_MMX>A_clear_R8.
   综合来看,A_Clear_With_SSE2和 yaos_AsmMemZero0 是最好的版本.

   3.3)注意,A_Clear作了特别的处理,当地址为 8X+4,从第二个DWORD开始使用rep stosd,否则,表现和memset类似,当开始地址为8X+4是,在PM上性能降低的事实未见于任何文档,是这次作性能测试时发现的。

[ 本帖最后由 liangbch 于 2008-5-9 09:40 编辑 ]

liangbch 发表于 2008-5-7 10:20:48

B计划之 拷贝函数 性能预览。

在PIV 2.6G 电脑上的运行结果,时间单位毫秒
length
source address
target address
memcpy
A_Copy
A_Copy_With_SSE2
A_Copy_R8
A_Copy_With_MMX
8192
16X+0
16X+0
0.004054
0.004171
0.005000
0.007523
0.005546
8192
16X+0
16X+4
0.008121
0.008080
0.018181
0.007566
0.018735
8192
16X+0
16X+8
0.005527
0.005548
0.005531
0.007357
0.004882
8192
16X+0
16X+12
0.007524
0.007694
0.018457
0.007330
0.019344
8192
16X+4
16X+0
0.011114
0.008427
0.018518
0.008229
0.018896
8192
16X+4
16X+4
0.008711
0.003847
0.002823
0.007567
0.004369
8192
16X+4
16X+8
0.010854
0.008079
0.018633
0.007568
0.018575
8192
16X+4
16X+12
0.007850
0.005095
0.005542
0.007342
0.005386
8192
16X+8
16X+0
0.005614
0.005217
0.005542
0.007771
0.004960
8192
16X+8
16X+4
0.008557
0.008301
0.018643
0.008116
0.018325
8192
16X+8
16X+8
0.005437
0.003857
0.002901
0.007570
0.004374
8192
16X+8
16X+12
0.008159
0.008095
0.018665
0.007580
0.018975
8192
16X+12
16X+0
0.009236
0.008360
0.018414
0.007771
0.018677
8192
16X+12
16X+4
0.008454
0.005234
0.005539
0.007776
0.005541
8192
16X+12
16X+8
0.008389
0.008461
0.018666
0.008055
0.018677
8192
16X+12
16X+12
0.008428
0.003865
0.002885
0.007566
0.004414

在PM 1.7G 电脑上的运行结果,时间单位毫秒
ength
source address
target address
memcpy
A_Copy
A_Copy_With_SSE2
A_Copy_R8
A_Copy_With_MMX
8192
16X+0
16X+4
0.014507
0.014507
0.011942
0.009043
0.008932
8192
16X+0
16X+8
0.007258
0.007210
0.008351
0.009045
0.008320
8192
16X+0
16X+12
0.014516
0.014519
0.009040
0.009011
0.008928
8192
16X+4
16X+0
0.014804
0.015114
0.009098
0.009756
0.008885
8192
16X+4
16X+4
0.014810
0.007192
0.008324
0.009540
0.008289
8192
16X+4
16X+8
0.014808
0.014826
0.011570
0.009023
0.008925
8192
16X+4
16X+12
0.014801
0.007222
0.008371
0.009033
0.008293
8192
16X+8
16X+0
0.007312
0.007260
0.008394
0.009602
0.008318
8192
16X+8
16X+4
0.014804
0.015111
0.009122
0.009783
0.008935
8192
16X+8
16X+8
0.007298
0.007157
0.008336
0.009551
0.008304
8192
16X+8
16X+12
0.014806
0.014822
0.011588
0.009028
0.008919
8192
16X+12
16X+0
0.015002
0.014980
0.011951
0.009919
0.008914
8192
16X+12
16X+4
0.014801
0.007203
0.008364
0.009654
0.008312
8192
16X+12
16X+8
0.014806
0.015115
0.009116
0.009855
0.008934
8192
16X+12
16X+12
0.014800
0.007196
0.008350
0.009536
0.008315


[ 本帖最后由 liangbch 于 2008-5-9 09:24 编辑 ]

liangbch 发表于 2008-5-7 10:21:08

B计划之 大数加函数 性能预览。

在PIV 2.6G 电脑上的运行结果,单位毫秒
length
BIN_ADD_C
BIN_Add
BIN_Add_4way_unroll
BIN_Add_3P_C
BIN_Add_3P_4way_unroll
8192
0.022580
0.047701
0.022125
0.019158
0.022113

在PM 1.7G 电脑上的运行结果,单位毫秒
length
BIN_ADD_C
BIN_Add
BIN_Add_4way_unroll
BIN_Add_3P_C
BIN_Add_3P_4way_unroll
8192
0.026193
0.025435
0.021803
0.025643
0.023143


1.函数说明:
1)BIN_ADD_C,C 语言版本,2操作数版,可计算a=a+b
2)BIN_Add,汇编语言版,2操作数版,可计算a=a+b
3)BIN_Add_4way_unroll,汇编语言版本,2操作数版,可计算a=a+b,使用4路循环展开
4)BIN_Add_3P_CC 语言版本,3操作数版,可计算c=a+b
5)BIN_Add_3OP_4way_unroll, 汇编语言版本,3操作数版,可计算c=a+b,使用4路循环展开

2.性能分析
3.1)在PIV CPU, C语言版优于汇编语言版,循环展开提速有时明显,有时反而性能下降,速度最快的版本竟然是C语言的3操作数版,这有点不可理解。
3.2)在PM CPU, 汇编语言版优于C语言版,循环展开提速明显,速度最快的版本竟然是汇编语言的2操作数版本,这和预期完全吻合.

[ 本帖最后由 liangbch 于 2008-5-9 09:25 编辑 ]

liangbch 发表于 2008-5-7 10:21:32

站楼先,B计划之 大数减 函数 性能预览,内容容后补上。
在PIV 2.6G 的运行结果,时间单位毫秒
length
BIN_Sub_C
BIN_Sub
BIN_sub_4way_unroll
BIN_sub_3P_C
BIN_sub_3P_4way_unroll
8192
0.055659
0.066025
0.022269
0.022327
0.022131

在PM上的运行结果,时间单位毫秒
length
BIN_Sub_C
BIN_Sub
BIN_sub_4way_unroll
BIN_sub_3P_C
BIN_sub_3P_4way_unroll
8192
0.068377
0.067515
0.025268
0.028997
0.025551

1.函数说明:
1)BIN_Sub_C,C 语言版本,2操作数版,可计算a=a-b
2)BIN_Sub,汇编语言版,2操作数版,可计算a=a-b
3)BIN_Sub_4way_unroll,汇编语言版本,2操作数版,可计算a=a-b,使用4路循环展开
4)BIN_Sub_3P_CC 语言版本,3操作数版,可计算c=a+b
5)BIN_Sub_3OP_4way_unroll, 汇编语言版本,3操作数版,可计算c=a-b,使用4路循环展开

2.性能分析
3.1)在PIV CPU, C语言版优于汇编语言版,循环展开提速有时明显,有时反而性能下降,速度最快的版本竟然是汇编语言的3操作数版。
3.2)在PM CPU, 汇编语言版优于C语言版,循环展开提速明显,速度最快的版本是汇编语言的2操作数版本,这和预期完全吻合.

[ 本帖最后由 liangbch 于 2008-5-9 09:43 编辑 ]

liangbch 发表于 2008-5-7 10:21:49

B计划之 大数求补函数 性能预览

在PIV 2.6G 上的运行结果为,时间单位毫秒

length
BIN_NEG
BIN_NEG_C
BIN_NEG_4way_unroll
BIN_Negate_SSE2
BIN_Negate_MMX
8192
0.009556
0.010306
0.008609
0.004231
0.005105


在PM 1.7G 的运行结果,时间单位毫秒
length
BIN_NEG
BIN_NEG_C
BIN_NEG_4way_unroll
BIN_Negate_SSE2
BIN_Negate_MMX
8192
0.012680
0.014490
0.007302
0.006058
0.006053


2。函数说明:
2.1)BIN_NEG,汇编语言的版本
2.2)BIN_NEG_C,C语言的版本
2.3)BIN_NEG_4way_unroll,汇编语言的版本,使用思路循环展开,每个循环步处理4个DWORD
2.4)BIN_Negate_SSE2,汇编语言的版本,使用SSE2 128bit 寄存器每个循环步处理4个DWORD
2.5)BIN_Negate_MMX, 汇编语言的版本,使用 64bit 寄存器每个循环步处理4个DWORD

3.性能分析:
对于PIV CPU,各个函数的速度关系为:BIN_Negate_SSE2>BIN_Negate_MMX>BIN_Negate_4way_unroll>BIN_NEG>BIN_NEG_C,
BIN_Negate_SSE2 是最快的版本。

对于PM CPU,各个函数的速度关系为:BIN_Negate_SSE2=BIN_Negate_MMX>BIN_Negate_4way_unroll>BIN_NEG>BIN_NEG_C,
BIN_Negate_SSE2 和 BIN_Negate_MMX 是最快的版本。

[ 本帖最后由 liangbch 于 2008-5-9 09:55 编辑 ]

无心人 发表于 2008-5-7 10:26:57

:)

让你抢先了

kofeffect 发表于 2008-5-7 10:48:53

难不成出现圈地运动了,呵呵。我也来占一席之地^_^

无心人 发表于 2008-5-7 11:07:28

:)

还差几个

移位函数2个

比较大小函数1个

从高位到低位搜索非零数字位置函数一个

liangbch 发表于 2008-5-7 11:37:24

原帖由 无心人 于 2008-5-7 11:07 发表 http://images.5d6d.net/dz60/common/back.gif
:)

还差几个

移位函数2个

比较大小函数1个

从高位到低位搜索非零数字位置函数一个

对于比较大小函数1个,一般不会出现大量连续的相同数据,复杂度较低,无需使用汇编。
对于搜索非零数字个,一般不会出现大量连续的零,复杂度较低,无需使用汇编。
页: [1] 2 3
查看完整版本: B计划之基本函数性能预览