CUDA常見問題與解答

2022-05-01 03:45:10 字數 2264 閱讀 3005

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計算得到的結果要略高一些。

Cuda 常見問題

1.在sdk自帶的例子程式中,發現src檔案珜下有.cpp檔案和.cu檔案。這兩種檔案的關係和各自的作用是什麼呀?答 sdk自帶例子中的.cpp檔案主要是一些cpu端處理,或者是使用cpu計算對照組結果,在某些例子中也會在.cpp檔案中以函式的形式呼叫封裝成c或者c 函式的gpu端 cu檔案中通常是...

python常見問題與解答

1 python函式返回多個值 def getvaule a,b c a b d a b e a b return e,d,e x,y,z getvaule 5,10 print x x,y y,z z 2 list去重問題 1 直觀方法 number 5,6,3,4,5,3,1,2,3,2,1,3...

oracle常見問題與解答

1.對於sql,有幾種方法檢視執行計畫,每種方法有什麼區別,對於一條正在執行的sql,如何檢視真實的,正在使用的執行計畫?答 第一種方法 explain plan for 生成指定sql語句的執行計畫,並把執行計畫儲存到使用者指定的表中,供使用者查詢,但不作為真正執行時的執行計畫,因為並沒有儲存在l...