作者DMFC (sole)
看板Fortran
标题Re: [问题] 效率
时间Thu Nov 14 04:56:35 2013
感谢大家对这问题有兴趣
但我没法贴全部程式码
因为我是用 chrome 在上 ptt
所以我每次复制贴上
chrome 都傻傻的给我"一行"贴上
它不懂什麽叫换行
因此我去找了一下网路空间
并上传SOURCE CODE
http://ge.tt/7QJGSAz/v/0
档名是 trans-WAVECAR.f90
WAVECAR 是一个 binary file
所以这个程式目的是要把 WAVECAR 转换成 ASCII 并转换成别种格式
这样我就可以用绘图软体把WAVECAR画出来
我是在 linux server 上作业
用的是 intel compiler 12.0
指令是用 ifort -assume byterecl trans-WAVECAR.f90
我所贴上来的部份是在 line 185~196 间
我有试过将 csumout 拿掉
程式执行通常都是秒杀
加上去後就不得了的慢了
: : xyz(1) = dble(ix)/dble(ngrid(1))
: : xyz(2) = dble(iy)/dble(ngrid(2))
: : xyz(3) = dble(iz)/dble(ngrid(3))
: 这边浪费很多加减乘除的处理时间...推文中讲过...不再累述....
: 程式码无全数贴出故无法得知中间少了啥....囧
: 理论上atmp & coeff这两个array要先填完...接下去作才有意义...
: 建议你在atmp = ......这一行用Euler formular拆解re part and im part
: 并先算完cdexp後...
: 再到下一行直接用dot函数处理并填到csumout里头....
: 最後3层loop结束後再加一行 csumout=csumout/dsqrt(Vol)
Euler formular 是指什麽
是这个嬷??
http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%85%AC%E5%BC%8F
令我难以接受的是
我试过
csum = sum(coeff(1:nplane)*cdexp(atmp(1:nplane)))/dsqrt(Vol) ! csum is complex
如果只是用一个参数去存取
程式效率很好
但只要再加入
csumout(ix,iy,iz)=csum
把 csum 存到三维矩阵
那效率就差很多很多很多 .....
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 80.98.198.158
1F:→ DMFC:所以我是觉得不是演算法的问题~这个程式原则上只是转档 11/14 04:59
2F:→ DMFC:没有用什麽伟大的演算法在里面 11/14 04:59
3F:→ latinboy: 秒杀大概真的是因为没有输出 过程被compiler跳过了 11/14 08:24
5F:→ Cypresslin:这样看起来有点像是因为你程式码实际走访所以元素的地 11/14 10:38
6F:→ Cypresslin:方只有把csum存到三维矩阵那边,所以没这行来编译时其 11/14 10:40
7F:→ Cypresslin:他东西就被最佳化弄掉了,你的x y z回圈很大吗? 11/14 10:40
8F:→ DMFC:普通 case 约 40x40x40 or 60x60x60 11/14 17:23
9F:→ DMFC:但我需要两倍左右~所以大约是 100x100x100 11/14 17:24
10F:→ MHG:cache problem...改存成1D array也是如此吗? 11/15 19:47
11F:→ DMFC:是的~也是过用一维~效率原则上是差不多的 11/15 21:07