找回密码
 欢迎注册
查看: 47818|回复: 27

[分享] B计划之基本函数性能预览

[复制链接]
发表于 2008-5-7 10:19:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
精华
 本帖将给出一些关于大数运算基本函数的性能,主要包括 清零,内存拷贝,大数加,大数减,大数求补。 1)除了明确指出外,所有函数都是我自己编写的。 2)限于条件,本帖只给出这些函数在 PIV2.6G,和 PM 1.7G 两台电脑的运行结果。如果没有特别指明,编译器为VC6.0. 3)本文中的大数 均使用 2进制,内部表示为用一个DWORD表示30bit,及$2^30$进制。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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_C C 语言版本,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 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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_C C 语言版本,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 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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 | 显示全部楼层
让你抢先了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-7 10:48:53 | 显示全部楼层
难不成出现圈地运动了,呵呵。我也来占一席之地^_^
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-7 11:07:28 | 显示全部楼层
还差几个 移位函数2个 比较大小函数1个 从高位到低位搜索非零数字位置函数一个
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-7 11:37:24 | 显示全部楼层
原帖由 无心人 于 2008-5-7 11:07 发表 还差几个 移位函数2个 比较大小函数1个 从高位到低位搜索非零数字位置函数一个
对于比较大小函数1个,一般不会出现大量连续的相同数据,复杂度较低,无需使用汇编。 对于搜索非零数字个,一般不会出现大量连续的零,复杂度较低,无需使用汇编。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-22 00:14 , Processed in 0.030842 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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