CUDA常见问题与解答
CUDA常見問題與解答
標(biāo)簽: cuda編譯器存儲多線程streamwindows 2012-05-25 14:47 3359人閱讀 評論(0) 收藏 舉報(bào)版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
1.在SDK自帶的例子程序中,發(fā)現(xiàn)SRC文件珜下有.cpp文件和.cu文件。這兩種文件的關(guān)系和各自的作用是什么呀?
? 答:SDK自帶例子中的.cpp文件主要是一些CPU端處理,或者是使用CPU計(jì)算對照組結(jié)果,在某些例子中也會在.cpp文件中以函數(shù)的形式調(diào)用封裝成C或者C++函數(shù)的GPU端代碼.cu文件中通常是與GPU核函數(shù)和CUDA API相關(guān)的內(nèi)容。
2.在SDK自帶的例子程序中,有一些帶有_kernel的.cu文件,在Visual Studio工程中的圖標(biāo)上有一個紅色的符號,是什么意思?
答:大我數(shù)SDK例子程序都將設(shè)備端代碼和主機(jī)端代碼放在不同的文件中,以template為例如: 它的主機(jī)端代碼在template.cu中,設(shè)備端代碼在template_kernel.cu中,并且有一個用于對照的CPU 和GPU結(jié)果的cpmpute_gold.cpp文件。template_kernel.cu 在visual Studio工程中的符號代表它不參與編譯。注意到template.cu文件中已經(jīng)參賽過#include"template_kernel.cu"包含了template_kernel.cu。在參考SDK地,要注意文件夾包含造成的影響,避免在自己的工程中出現(xiàn)在重復(fù)定義可者變量的作用域沒有覆蓋端和主機(jī)端代碼。如果要將SDK中的代碼直接用于其他工程中,一定要注意將帶有_kernel后綴的.cu文件排除在編譯外,避免重復(fù)定義。
3.為什么編譯CUDA程序時,經(jīng)常出現(xiàn)未定義變量的錯誤?
答:存儲在某些存儲器中的某些變量,如__constant__,__device__,texture, 必須在所有的函數(shù)定義外定義,即定義的人全局變量。這些變量必須有正確的作用域,例如texture型變量必須對設(shè)備端代碼和主機(jī)端代碼同時可見,并且如果需要從主機(jī)端訪問時,也要對主機(jī)端代碼可見。SDK中的例子通過文件包含解決了這些問題。讀者可以將主機(jī)端代碼 和設(shè)備端代碼都寫在一個.cu文件中,或都是將這些變量定義在頭文件中(注意避免重復(fù)定義)來解決這些問題。
4.為什么在工程中無法使用原子函數(shù),雙精度等功能?
答:首先,必須確定目前使用的設(shè)備的計(jì)算能力版本能支持相應(yīng)的函數(shù);其次,在編譯時,nvcc編譯器默認(rèn)的目標(biāo)設(shè)備為計(jì)算能力1.0版本,無法支持高計(jì)算能力版本的函數(shù),需要通過-code,-arch等編譯選項(xiàng)打開。
5.CUDA程序運(yùn)行時出現(xiàn)藍(lán)屏、死機(jī)等現(xiàn)象,或者打印出kernel? luanch timed out?
答:早期版本的CUDA更加容易出現(xiàn)藍(lán)屏或者死機(jī),目前已經(jīng)大有改善。造成藍(lán)屏、死機(jī) 自動重啟等現(xiàn)象的常見原因主要有:訪問顯存時發(fā)生趆界、多個線程競寫同一數(shù)據(jù)。kernel launch timed out的原因是Windows操作系統(tǒng)會查詢顯卡狀態(tài),如果顯卡長時間沒有反應(yīng)就會重并按啟顯卡,這限制了一個kernel的執(zhí)行時間。經(jīng)過試驗(yàn),在XP系統(tǒng)下kernel不能超過12秒,而Vister和Win7操作系統(tǒng)的時間還要更短一些。如果發(fā)生這一問題,應(yīng)該首先檢查代碼中是否出現(xiàn)了死循環(huán)或者競寫,然后采用減小kernel、采用stream操作等手段避免。如果確實(shí)需要在一個kernel中完成較大的計(jì)算量,可以使用更強(qiáng)的顯卡、使用專門的Tesla流計(jì)算方案、改用Linux操作系統(tǒng),或者使用一塊不進(jìn)行顯示的顯卡(但是Vista和Win7有時會關(guān)閉沒有插顯示器的顯卡)。未來版本的CUDA會對這些問題繼續(xù)進(jìn)行改進(jìn)。
6.為什么在編譯或者運(yùn)行時會出現(xiàn)資源朱足的提示?
如果在程序中使用了太多的register,shared,texture或者constant資源,在編譯時會出現(xiàn)報(bào)錯;如果運(yùn)行中使用了太多的顯存,或者是一個block中的線程太多,在運(yùn)行時會出現(xiàn)錯誤。在低運(yùn)算能力版本的硬件上運(yùn)行為高計(jì)算能力設(shè)備編寫的程序時也會發(fā)生錯誤。在使用變量時,需要注意各種變量的大小不能超過目標(biāo)設(shè)備的計(jì)算能力版本本的相應(yīng)限制,使用的顯存也不能超過顯存的量(如果這個顯卡還需要需出顯示,還要減去顯示使用的顯存大小)。解決資源方法主要有:減少程序使用的資源,注意釋放不用的顯存和內(nèi)存,可者將問題進(jìn)行分治。如果確有需要,應(yīng)該使用擁有更大存儲器的顯卡,或者Tesla,Quadro等專業(yè)解決方案。
7.為什么時候在程序中無法得到正確的結(jié)果?為會有時每次運(yùn)行的結(jié)果都不同?為什么GPU的結(jié)果與CPU的結(jié)果不同?
答:由于CUDA中存在大量線程的并行,因此程序中細(xì)小的錯誤也會產(chǎn)生相當(dāng)嚴(yán)重的后果。造成結(jié)果錯誤的可能原因有:死循環(huán)、類型溢出、錯誤的數(shù)據(jù)類型、訪存赿界、競寫,缺乏同步、編譯器因素等。如果是發(fā)生多線程競寫一個數(shù)據(jù)的情況,應(yīng)該采用原子操作來避免;在shared memory 發(fā)生warp間交換操作的數(shù)據(jù)時,一定要使用柵欄同步保證數(shù)據(jù)的可靠性;編譯器會優(yōu)化掉它認(rèn)為多余的的存儲訪問,要通過valid關(guān)鍵字進(jìn)行管理;過于復(fù)雜的循環(huán)有時無法被正確解析,產(chǎn)和錯誤結(jié)果。如果同一個程序?qū)ν唤M數(shù)據(jù)每次運(yùn)行得到的結(jié)果不同,一般是發(fā)生了競寫,或者缺乏同步。GPU和CPU的運(yùn)算單元采用了不同的微架構(gòu),因此即使都符合IEEE 754規(guī)范,結(jié)果不一樣是理所當(dāng)然的。由于CPU 中可以使用更長字長的存儲器來保存中間變量,因此通常使用CPU計(jì)算得到的結(jié)果要略高一些。
總結(jié)
以上是生活随笔為你收集整理的CUDA常见问题与解答的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux动态链接库的使用
- 下一篇: 802.11 n wlan linux驱