Re: [問題] 效率

看板Fortran作者 (sole)時間10年前 (2013/11/14 04:56), 編輯推噓0(0011)
留言11則, 4人參與, 最新討論串6/7 (看更多)
感謝大家對這問題有興趣 但我沒法貼全部程式碼 因為我是用 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

11/14 04:59, , 1F
所以我是覺得不是演算法的問題~這個程式原則上只是轉檔
11/14 04:59, 1F

11/14 04:59, , 2F
沒有用什麼偉大的演算法在裡面
11/14 04:59, 2F

11/14 08:24, , 3F
秒殺大概真的是因為沒有輸出 過程被compiler跳過了
11/14 08:24, 3F

11/14 10:35, , 4F
網路上有很多貼程式碼的地方http://ppt.cc/CHM-
11/14 10:35, 4F

11/14 10:38, , 5F
這樣看起來有點像是因為你程式碼實際走訪所以元素的地
11/14 10:38, 5F

11/14 10:40, , 6F
方只有把csum存到三維矩陣那邊,所以沒這行來編譯時其
11/14 10:40, 6F

11/14 10:40, , 7F
他東西就被最佳化弄掉了,你的x y z迴圈很大嗎?
11/14 10:40, 7F

11/14 17:23, , 8F
普通 case 約 40x40x40 or 60x60x60
11/14 17:23, 8F

11/14 17:24, , 9F
但我需要兩倍左右~所以大約是 100x100x100
11/14 17:24, 9F

11/15 19:47, , 10F
cache problem...改存成1D array也是如此嗎?
11/15 19:47, 10F

11/15 21:07, , 11F
是的~也是過用一維~效率原則上是差不多的
11/15 21:07, 11F
文章代碼(AID): #1IW-UBA8 (Fortran)
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
完整討論串 (本文為第 6 之 7 篇):
問題
1
4
問題
0
8
問題
3
28
問題
問題
0
11
問題
0
3
文章代碼(AID): #1IW-UBA8 (Fortran)