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

至尊木蟲 (正式寫手)
木蟲 (小有名氣)
木蟲 (著名寫手)
木蟲 (著名寫手)
未來(lái)國(guó)家凍涼

| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 266分,求材料相關(guān)專業(yè)調(diào)劑 +8 | 哇呼哼呼哼 2026-03-30 | 10/500 |
|
|---|---|---|---|---|
|
[考研] 材料科學(xué)與工程調(diào)劑 +11 | 深V宿舍吧 2026-03-30 | 12/600 |
|
|
[考研] 070300化學(xué)279求調(diào)劑 +6 | 哈哈哈^_^ 2026-03-31 | 8/400 |
|
|
[考研] 085404 22408 315分 +3 | zhuangyan123 2026-03-31 | 3/150 |
|
|
[考研] 材料工程專碩求調(diào)劑 +8 | hyl3153942 2026-03-29 | 8/400 |
|
|
[考研] 327求調(diào)劑 +5 | 小卡不卡. 2026-03-29 | 5/250 |
|
|
[考研] 289求調(diào)劑 +16 | 新時(shí)代材料 2026-03-27 | 16/800 |
|
|
[考研] 材料專碩 085600求調(diào)劑 +7 | BBQ233 2026-03-30 | 7/350 |
|
|
[考研] 0703 化學(xué) 求調(diào)劑,一志愿山東大學(xué) 342 分 +7 | Shern—- 2026-03-28 | 7/350 |
|
|
[考研] 材料與化工272求調(diào)劑 +21 | 阿斯蒂芬2004 2026-03-28 | 21/1050 |
|
|
[考研] 085600,材料與化工321分求調(diào)劑 +10 | 大饞小子 2026-03-28 | 10/500 |
|
|
[考研] 275求調(diào)劑 +15 | Micky11223 2026-03-25 | 20/1000 |
|
|
[考研] 本科雙非材料,跨考一志愿華電085801電氣,283求調(diào)劑,任何專業(yè)都可以 +6 | 芝士雪baoo 2026-03-28 | 8/400 |
|
|
[考研] 330分求調(diào)劑 +5 | qzenlc 2026-03-29 | 5/250 |
|
|
[考研] 308求調(diào)劑 +7 | 墨墨漠 2026-03-27 | 7/350 |
|
|
[考研] 一志愿上海理工能源動(dòng)力(085800)310分求調(diào)劑 +3 | zhangmingc 2026-03-27 | 4/200 |
|
|
[考研] 一志愿南師大0703化學(xué) 275求調(diào)劑 +4 | Ripcord上岸 2026-03-27 | 4/200 |
|
|
[考博] 26申博 +3 | 加油沖! 2026-03-26 | 3/150 |
|
|
[考研] 一志愿天津大學(xué)339材料與化工求調(diào)劑 +3 | 江往賣魚 2026-03-26 | 3/150 |
|
|
[考研] 各位老師您好:本人初試372分 +5 | jj涌77 2026-03-25 | 6/300 |
|