我已经开始编写新的CUDA应用程序了。但是我沿途遇到了一个有趣的绕道而行。 在变量x上调用第一个cudaMalloc,第一次失败。但是,当我第二次调用它时,它会返回cudaSuccess。最近升级到CUDA 4.0 SDK,这是一个非常奇怪的错误。
我甚至做了一些测试,似乎cudaMalloc的第一次调用失败了。
答案 0 :(得分:4)
对任何cuda库函数的第一次调用启动初始化子例程。可能会发生以某种方式初始化失败而不是cudaMalloc本身。 (CUDA编程指南,第3.2.1节)
不知何故,稍后,尽管最初的失败,它似乎仍然有效。我不知道你的设置和你的代码所以我不能真正帮助你。查看编程指南!
答案 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正确初始化。