最终优化版本运行时间:
单核:0.562s(Celeron 3.06G)
双核:0.375s(AMD Athlon 64 X2 Dual 3800+ 2.01GHz)
//////////////////////////////////////////////////////////////////
优化步骤和执行时间
测试系统主要使用使用Celeron 3.06G。每一步优化后均使用VTune分析主要
函数的运行情况。多核测试使用AMD Athlon 64 X2 Dual 3800+ 2.01GHz。
1 原始代码(4.39s)
使用VS2005转化原始的工程文件,编译并运行。
用VTune分析,可以看出,性能主要损失在computePot函数以及其子函数上,
其中SQRT操作非常耗费时间。
2 优化pow为mul(3.156s)
容易看到pow(x, 2)等价于x*x。乘法操作比pow要高效很多。
用VTune分析,发现computePot函数占用CPU降为19%。
3 使用Intel编译器(2.734s)
转化工程文件,使用IntelC++编译器。
用VTune分析,发现computePot函数占用CPU为99.29%。可以看出,SQRT等函
数都被computePot函数囊括在内了。
4 使用SSE2指令优化关键运算(2.453s)
通过应用SSE2指令,把数据每四组一起进行并发的运算。
经检测,每四组进行运算和每两组进行运算效果差不多,这应该是因为FDIV
运算单元已经饱和的缘故。时间主要耗费在SQRT和DIV上了。用VTune分析,
computePot函数占用CPU为99%。
5 迭代运算1/sqrt(x)(0.875s)
使用RSQRTPS计算近似值,通过两次迭代求出精确值。必须迭代两次,否则精
度不够。
用VTune分析,computePot函数占用CPU为98%。
6 汇编优化(0.609s)
为减少内存读写次数,提高指令并发程度,使用汇编语言进行关键算法优化。
每次进行8组数据的运算(sum_rsqrt函数),不足8组的剩余数据单独计算
(sum_rsqrt_trailing函数)。
用VTune分析,computePot函数及子函数占用CPU约为98%。
7 指令重排(0.578s)
优化主要针对sum_rsqrt函数。通过调整指令的运算顺序,增加指令并发度。
每次调整都通过VTune查看sum_rsqrt函数的运行时间。重排前,Clockticks
为575,重排后Clockticks为524。
8 rand函数优化(0.562s)
自行实现rand函数,减少系统调用和线程同步的开销。
9 双核测试(0.375s)
由于条件所限,使用AMD Athlon 64 X2 Dual 3800+作为测试CPU。
10 多线程代码(0.375s)
自行实现的多线程代码,替代OpenMP。
发表于 @ 2007年01月21日 15:52:00 | 评论( loading... ) | 举报| 收藏