我的优化报告和源代码

housisong 2007-01-20 04:03:59
英特尔最近举办了一次多核平台编码优化大赛,我也参加了这次比赛;大赛代码提交阶段已经结束,所以也可以公开自己的优化过程;

源代码和详细的优化说明:
http://blog.csdn.net/housisong/archive/2007/01/20/1488465.aspx

我实现了很多个版本(包括很多失败的版本,还有很多想到的但没有空余时间去实现的方案;这部分的补充文章还没有完成),文章只介绍了我的提交过程中的优化的主线;
...全文
1032 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingdog 2007-01-21
  • 打赏
  • 举报
回复
为什么说对于我的代码应该有效?


的确像是在拼体力活。太累了。
housisong 2007-01-21
  • 打赏
  • 举报
回复
其实这次的竞赛还是比较简单的;
最优方案路径很多人可能都能一眼看出来; (我走了一个弯路,跑去用代码的复杂性换取内存的顺序读取,后来发现,这完全没有意义:) 不过对于flyingdog的代码应该有效)

还是喜欢那种有一定复杂性的题,允许自己设计算法的那种:) ,但问题也不能太过复杂(时间耗不起)

拼代码级的优化好像在干体力活,呵呵
huanyun 2007-01-21
  • 打赏
  • 举报
回复
感觉housisong(HouSisong) flyingdog(flyingdog)以及我自己的优化方式很像啊
都是_mm_rsqrt_ps一次float迭代 一次double迭代

^_^
甚至我和housisong(HouSisong)的线程任务分配都很相似是根据CPU个数动态计算的


赖勇浩 2007-01-21
  • 打赏
  • 举报
回复
vc6都支持的,只不过你需要下载相应的SP包而已。
flyingdog 2007-01-21
  • 打赏
  • 举报
回复
哦。intel的文档中有对应的函数形式我知道。
但是我一直以为这个是icc特有的。
没想到vc2005也支持。
sjjf 2007-01-21
  • 打赏
  • 举报
回复
mark
茶禅如水 2007-01-21
  • 打赏
  • 举报
回复
谢谢了,呵呵
flyingdog 2007-01-21
  • 打赏
  • 举报
回复
to zidongli
有关我的程序的并行化说明,请看
http://blog.csdn.net/flyingdog/archive/2007/01/21/1489183.aspx
huanyun 2007-01-21
  • 打赏
  • 举报
回复
试过啊 不过非常慢 4秒左右
很多时间都在线程切换上了
茶禅如水 2007-01-21
  • 打赏
  • 举报
回复
我的是单核的,1个进程跑2个线程,
用SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);就死机了几乎,因为没反应了。
你的程序在我这上面只能跑1个线程,呵呵!

不知道是不是不能线程数多于cpu数
huanyun你有把你的程序改成3个或更多试验一下吗?

huanyun 2007-01-21
  • 打赏
  • 举报
回复
死机估计是线程调度的问题
我之前也没用这个 后来发现开的软件多了就慢好多
我就加上了 SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);
一直也没有发现死机.
flyingdog 2007-01-21
  • 打赏
  • 举报
回复
但是我觉得整个r数组才20来K,对于L1 cache 32K来说,可以算好几乎所有的数据都在L1 cache中。而对于L1 cache的访问,酷睿 2每次访问128bit,延迟都是3周期,写入是2周期。写入可以进去store buffer,所以实际这种强度的写入不占用周期数。读取也因为浮点加和乘耗费了大量的周期,真的到要用数据的时候都已经准备好了。而且酷睿 2支持6条还是8条正向(指针增加)访问的cache 预取。

到是当一个核计算完r数组,另外一个核要用时。即数据在原来核的L1 cache中,并且是改写状态。在酷睿 2的cache结构上,那种访问想访问内存一样。需要几十个周期。
茶禅如水 2007-01-21
  • 打赏
  • 举报
回复
huanyun 和 housisong 都把那段pow汇编实现了,而flyingdog没有
在icc下pow可以自动向量化,是使用了SSE2,其实达到了同样的效果

我用Vtune看了flyingdog的程序,2个线程分配的极好!有什么经验啊?!

huanyun使用了SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);
我用了这个参数,REALTIME_PRIORITY_CLASS
机器就死机了,实时用不好很危险啊!呵呵,不过你的程序很稳定,能介绍一下吗?
茶禅如水 2007-01-21
  • 打赏
  • 举报
回复
huanyun
housisong
flyingdog

学习了你们的代码,很有收获。
如果用icc来编译你们的代码,我想速度其实不差多少在0.0x,呵呵
不知有没有用vc8来编译你们的代码
huanyun 2007-01-21
  • 打赏
  • 举报
回复
转换
double r[DIMS][NPARTS];

double r[NPARTS][DIMS];

应该有一定效果吧!

我也花了不少时间在这上面
housisong 2007-01-20
  • 打赏
  • 举报
回复
"编译器:Visual Studio 2005支持
#include <emmintrin.h>
_mm_sub_pd
之类的?"

恩,vc2005编译器支持; icc也支持;
你查intel的汇编指令文档的时候,都会告诉你对应的函数调用形式;
housisong 2007-01-20
  • 打赏
  • 举报
回复
"可惜没看到你结合Intel提供的那些工具啊"

我的AMD CPU 啊:(
pipilu1984 2007-01-20
  • 打赏
  • 举报
回复
优化效果很不错

可惜没看到你结合Intel提供的那些工具啊
CruelYoung123 2007-01-20
  • 打赏
  • 举报
回复
学习
flyingdog 2007-01-20
  • 打赏
  • 举报
回复
问题:
编译器:Visual Studio 2005支持
#include <emmintrin.h>
_mm_sub_pd
之类的?
加载更多回复(2)

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧