我已經開始編寫新的CUDA應用程序。不過,我沿途有一段有趣的彎路。 在變量x上調用第一個cudaMalloc,第一次失敗。但是,當我第二次返回cudaSuccess時調用它。最近升級到CUDA 4.0 SDK,這是一個非常奇怪的錯誤。CUDA cudaMalloc
我甚至做了一些測試,似乎第一次調用cudaMalloc失敗。
我已經開始編寫新的CUDA應用程序。不過,我沿途有一段有趣的彎路。 在變量x上調用第一個cudaMalloc,第一次失敗。但是,當我第二次返回cudaSuccess時調用它。最近升級到CUDA 4.0 SDK,這是一個非常奇怪的錯誤。CUDA cudaMalloc
我甚至做了一些測試,似乎第一次調用cudaMalloc失敗。
對任何cuda庫函數的第一次調用將啓動初始化子例程。可能會發生初始化失敗,而不是cudaMalloc本身。 (CUDA編程指南第3.2.1節)
不知何故,後來,儘管最初出現故障,但似乎仍然有效。我不知道你的設置和你的代碼,所以我不能進一步幫助你。檢查編程指南!
使用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正確初始化。
但是,不要依賴從SDK到你的代碼。只需複製宏並使用它(BSD許可證,這樣做沒問題)。由於很多原因,使用cutils是一個壞主意。 – talonmies
@talonmies,我一直在Ubuntu,Redhat和Windows上使用cutils,沒有任何問題。你是否提交了關於你遇到的問題的錯誤報告或問題? –
這不是說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
在旁邊注意,我分配多少內存並不重要,這是我第一次猜測內存對齊問題。 – Nocturnal
cudaGetLastError可能會返回以前異步調用的錯誤,如果這是您的失敗所指。 –
你能包括一個小例子嗎? –