| 5 | 1/1 | 返回列表 |
| 查看: 2783 | 回復: 9 | |||
| 本帖產(chǎn)生 1 個 程序強帖 ,點擊這里進行查看 | |||
| 當前只顯示滿足指定條件的回帖,點擊這里查看本話題的所有回帖 | |||
coolrainbow木蟲 (著名寫手)
未來國家凍涼
|
[交流]
【轉(zhuǎn)帖】intel Fortran編譯器的一個“危險”優(yōu)化 已有9人參與
|
||
|
源地址:http://hi.baidu.com/coolrainbow/ ... d6c40c5aaf535e.html 今天無意中發(fā)現(xiàn)了intel編譯器優(yōu)化的一個問題。我有一個程序,大致是這樣 program main integer, parameter :: n = 1000 real(kind = 8) value(n) integer i call computation(value) do i = 1, n write (*,*) value(n) enddo end 其中computation是一個計算量極大的subroutine。利用intel編譯編譯,分別令n = 1000和n = 5000,不優(yōu)化和優(yōu)化執(zhí)行的時間 n 1000 5000 O0 12min 60min O2 7min 36min 后來,我無意中將輸出函數(shù)的代碼取消了,也即: program main integer, parameter :: n = 1000 real(kind = 8) value(n) integer i call computation(value) end 再次運行,驚現(xiàn)! n 1000 5000 O0 11min30s 59min O2 0.003s 0.003s 看到這種結(jié)果,我目瞪口呆,可是當我發(fā)現(xiàn)n=1000和5000是執(zhí)行時間相同,我就猜測computation這個子過程根本就沒有執(zhí)行。那么為什么沒執(zhí)行呢?我猜測:intel編譯器在O2過程中,發(fā)現(xiàn)后續(xù)代碼沒有用到value這個數(shù)組,也沒有牽扯到computation函數(shù)內(nèi)部的任何內(nèi)容,因此干脆將其優(yōu)化掉了。 這個猜測對嗎?決定看一下。在n=1000時候,我將兩段代碼編譯成匯編語言: ifort -O0 -o pO0.s -S foo.f90 ifort -O2 -o pO2.s -S foo.f90 首先觀察pO0.s,發(fā)現(xiàn): # -- Begin MAIN__ ......... call foo_mp_computation_ #369.10 ........ # -- End MAIN__ 果然,main中調(diào)用了computation函數(shù)。再看pO2.s,我們發(fā)現(xiàn): # -- Begin MAIN__ ........ # -- End MAIN__ 確確實實沒有發(fā)現(xiàn)computation函數(shù)調(diào)用的匯編代碼,哈哈,看來我的推測是對的。 下面這段比較小的代碼,大家可以自己用編譯器編譯一下,我用ifort編譯了一下,和上面是一樣的,通過匯編語言可以發(fā)現(xiàn),開啟O2時,匯編代碼的MAIN中沒有出現(xiàn)調(diào)用perform函數(shù)的內(nèi)容。當然,如果我說的不對,希望大家指教,呵呵。 subroutine perform(value, n) integer n real(kind = 8) value(n) integer i do i = 1, n value(i) = 2.0*i enddo return end subroutine program main integer, parameter :: n = 10 real(kind = 8) value(n) call perform(value,n) end 事實上,這個例子表明,編譯器的優(yōu)化選項確實有一定的危險性,盡管在這個例子中,并沒有什么問題,但是在投產(chǎn)級別的軟件中啟動優(yōu)化選項時的確要慎重,一般不要啟用O3這種激進的優(yōu)化,即使啟用也一定要試驗確定代碼無誤后才行 |

木蟲 (著名寫手)
木蟲 (小有名氣)
木蟲 (著名寫手)
未來國家凍涼

金蟲 (正式寫手)
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 320分,材料與化工專業(yè),求調(diào)劑 +9 | 一定上岸aaa 2026-03-27 | 13/650 |
|
|---|---|---|---|---|
|
[考研] 317分 一志愿南理工材料工程 本科湖工大 求調(diào)劑 +6 | 芋泥小鈴鐺 2026-03-28 | 6/300 |
|
|
[考研] 0703本科鄭州大學求調(diào)劑 +3 | nhj_ 2026-03-25 | 3/150 |
|
|
[考研] 0703一志愿9,初試成績:338,四六級已過,有科研經(jīng)歷,求調(diào)劑! +4 | Zuhui0306 2026-03-25 | 4/200 |
|
|
[考研] 321求調(diào)劑 +6 | 璞玉~~ 2026-03-25 | 6/300 |
|
|
[考研] 0703化學求調(diào)劑,各位老師看看我!。 +5 | 祁祺祺 2026-03-25 | 5/250 |
|
|
[考研] 070300化學求調(diào)劑 +4 | 起個名咋這么難 2026-03-27 | 4/200 |
|
|
[考研] 315調(diào)劑 +4 | 0860求調(diào)劑 2026-03-26 | 5/250 |
|
|
[碩博家園] 北京林業(yè)大學碩導招生廣告 +6 | kongweilin 2026-03-26 | 8/400 |
|
|
[考研] 材料學碩333求調(diào)劑 +8 | 北道巷 2026-03-24 | 8/400 |
|
|
[考研] 276求調(diào)劑。有半年電池和半年高分子實習經(jīng)歷 +10 | 材料學257求調(diào)劑 2026-03-23 | 11/550 |
|
|
[考研] 機械學碩310分,數(shù)一英一,一志愿211本科雙非找調(diào)劑信息 +3 | @357 2026-03-25 | 3/150 |
|
|
[考研] 尋找調(diào)劑 +5 | 倔強芒? 2026-03-21 | 8/400 |
|
|
[考研] 263求調(diào)劑 +6 | yqdszhdap- 2026-03-22 | 10/500 |
|
|
[考研] 085600 材料與化工 329分求調(diào)劑 +9 | Mr. Z 2026-03-25 | 9/450 |
|
|
[考研] 機械學碩總分317求調(diào)劑。。。 +4 | Acaciad 2026-03-25 | 4/200 |
|
|
[考研] 求調(diào)劑 +6 | 研研,接電話 2026-03-24 | 7/350 |
|
|
[考研] 277分求調(diào)劑,跨調(diào)材料 +3 | 考研調(diào)劑lxh 2026-03-24 | 3/150 |
|
|
[考研] 070300,一志愿北航320求調(diào)劑 +3 | Jerry0216 2026-03-22 | 5/250 |
|
|
[考研] 285求調(diào)劑 +6 | ytter 2026-03-22 | 6/300 |
|