CUDA常見問題與解答


1.在SDK自帶的例子程序中,發現SRC文件珜下有.cpp文件和.cu文件。這兩種文件的關系和各自的作用是什么呀?

答:SDK自帶例子中的.cpp文件主要是一些CPU端處理,或者是使用CPU計算對照組結果,在某些例子中也會在.cpp文件中以函數的形式調用封裝成C或者C++函數的GPU端代碼.cu文件中通常是與GPU核函數和CUDA API相關的內容。

2.在SDK自帶的例子程序中,有一些帶有_kernel的.cu文件,在Visual Studio工程中的圖標上有一個紅色的符號,是什么意思?

答:大多數SDK例子程序都將設備端代碼和主機端代碼放在不同的文件中,以template為例如:它的主機端代碼在template.cu中,設備端代碼在template_kernel.cu中,並且有一個用於對照的CPU 和GPU結果的cpmpute_gold.cpp文件。template_kernel.cu 在visual Studio工程中的符號代表它不參與編譯。注意到template.cu文件中已經通過#include"template_kernel.cu"包含了template_kernel.cu。如果要將SDK中的代碼直接用於其他工程中,一定要注意將帶有_kernel后綴的.cu文件排除在編譯外,避免重復定義。

3.為什么編譯CUDA程序時,經常出現未定義變量的錯誤?

答:存儲在某些存儲器中的某些變量,如__constant__,__device__,texture, 必須在所有的函數定義外定義,即定義的全局變量。這些變量必須有正確的作用域,例如texture型變量必須對設備端代碼和主機端代碼同時可見,並且如果需要從主機端訪問時,也要對主機端代碼可見。SDK中的例子通過文件包含解決了這些問題。讀者可以將主機端代碼和設備端代碼都寫在一個.cu文件中,或都是將這些變量定義在頭文件中(注意避免重復定義)來解決這些問題。

4.為什么在工程中無法使用原子函數,雙精度等功能?

答:首先,必須確定目前使用的設備的計算能力版本能支持相應的函數;其次,在編譯時,nvcc編譯器默認的目標設備為計算能力1.0版本,無法支持高計算能力版本的函數,需要通過-code,-arch等編譯選項打開。

5.CUDA程序運行時出現藍屏、死機等現象,或者打印出kernel  luanch timed out?

答:早期版本的CUDA更加容易出現藍屏或者死機,目前已經大有改善。造成藍屏、死機、自動重啟等現象的常見原因主要有:訪問顯存時發生趆界、多個線程競寫同一數據。kernel launch timed out的原因是Windows操作系統會查詢顯卡狀態,如果顯卡長時間沒有反應就會重啟顯卡,這限制了一個kernel的執行時間。經過試驗,在XP系統下kernel不能超過12秒,而Vista和Win7操作系統的時間還要更短一些。如果發生這一問題,應該首先檢查代碼中是否出現了死循環或者競寫,然后采用減小kernel、采用stream操作等手段避免。如果確實需要在一個kernel中完成較大的計算量,可以使用更強的顯卡、使用專門的Tesla流計算方案、改用Linux操作系統,或者使用一塊不進行顯示的顯卡(但是Vista和Win7有時會關閉沒有插顯示器的顯卡)。未來版本的CUDA會對這些問題繼續進行改進。

6.為什么在編譯或者運行時會出現資源不足的提示?

如果在程序中使用了太多的register,shared,texture或者constant資源,在編譯時會出現報錯;如果運行中使用了太多的顯存,或者是一個block中的線程太多,在運行時會出現錯誤。在低運算能力版本的硬件上運行為高計算能力設備編寫的程序時也會發生錯誤。在使用變量時,需要注意各種變量的大小不能超過目標設備的計算能力版本本的相應限制,使用的顯存也不能超過顯存的量(如果這個顯卡還需要輸出顯示,還要減去顯示使用的顯存大小)。解決資源方法主要有:減少程序使用的資源,注意釋放不用的顯存和內存,可者將問題進行分治。如果確有需要,應該使用擁有更大存儲器的顯卡,或者Tesla,Quadro等專業解決方案。

7.為什么時候在程序中無法得到正確的結果?為什么有時每次運行的結果都不同?為什么GPU的結果與CPU的結果不同?

答:由於CUDA中存在大量線程的並行,因此程序中細小的錯誤也會產生相當嚴重的后果。造成結果錯誤的可能原因有:死循環、類型溢出、錯誤的數據類型、訪存赿界、競寫、缺乏同步、編譯器因素等。如果是發生多線程競寫一個數據的情況,應該采用原子操作來避免;在shared memory 發生warp間交換操作的數據時,一定要使用柵欄同步保證數據的可靠性;編譯器會優化掉它認為多余的的存儲訪問,要通過valid關鍵字進行管理;過於復雜的循環有時無法被正確解析,產生錯誤結果。如果同一個程序對同一組數據每次運行得到的結果不同,一般是發生了競寫,或者缺乏同步。GPU和CPU的運算單元采用了不同的微架構,因此即使都符合IEEE 754規范,結果不一樣是理所當然的。由於CPU 中可以使用更長字長的存儲器來保存中間變量,因此通常使用CPU計算得到的結果要略高一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM