2011-06-29 82 views
3

我已經開始編寫新的CUDA應用程序。不過,我沿途有一段有趣的彎路。 在變量x上調用第一個cudaMalloc,第一次失敗。但是,當我第二次返回cudaSuccess時調用它。最近升級到CUDA 4.0 SDK,這是一個非常奇怪的錯誤。CUDA cudaMalloc

我甚至做了一些測試,似乎第一次調用cudaMalloc失敗。

+0

在旁邊注意,我分配多少內存並不重要,這是我第一次猜測內存對齊問題。 – Nocturnal

+2

cudaGetLastError可能會返回以前異步調用的錯誤,如果這是您的失敗所指。 –

+0

你能包括一個小例子嗎? –

回答

4

對任何cuda庫函數的第一次調用將啓動初始化子例程。可能會發生初始化失敗,而不是cudaMalloc本身。 (CUDA編程指南第3.2.1節)

不知何故,後來,儘管最初出現故障,但似乎仍然有效。我不知道你的設置和你的代碼,所以我不能進一步幫助你。檢查編程指南!

2

使用CUDA_SAFE_CALL宏我強烈建議,如果你不 - 給力的線程同步,至少在你調試代碼:

CUDA_SAFE_CALL(cudaMalloc((void**) &(myVar), mem_size_N)); 

更新:按@talonmies,你不需要cutil庫。因此,讓我們改寫了解決方案:

/* Allocate Data */ 
cudaMalloc((void**) &(myVar), mem_size_N); 

/* Force Thread Synchronization */ 
cudaError err = cudaThreadSynchronize(); 

/* Check for and display Error */ 
if (cudaSuccess != err) 
{ 
    fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n", 
      __FILE__, __LINE__, cudaGetErrorString(err)); 
} 

而且在對方的回答指出的那樣 - 你可能要包括之前分配內存的同步&檢查,以確保公正的API正確初始化。

+0

但是,不要依賴從SDK到你的代碼。只需複製宏並使用它(BSD許可證,這樣做沒問題)。由於很多原因,使用cutils是一個壞主意。 – talonmies

+0

@talonmies,我一直在Ubuntu,Redhat和Windows上使用cutils,沒有任何問題。你是否提交了關於你遇到的問題的錯誤報告或問題? –

+2

這不是說cutils有問題。這是頭和庫函數僅用於支持SDK示例。沒有文檔,也沒有關於正確性或功能的保證,或者這些功能將在版本之間保留。 NVIDIA員工特別建議不要在生產代碼中使用cutil [例如](http://forums.nvidia.com/index.php?showtopic=106381&view=findpost&p=586994)和[another](http://forums.nvidia .com/index.php?showtopic = 92389&view = findpost&p = 519951) – talonmies