CUDA cudaMalloc

时间:2011-06-29 02:59:05

标签: c++ cuda gpu gpgpu

我已经开始编写新的CUDA应用程序了。但是我沿途遇到了一个有趣的绕道而行。 在变量x上调用第一个cudaMalloc,第一次失败。但是,当我第二次调用它时,它会返回cudaSuccess。最近升级到CUDA 4.0 SDK,这是一个非常奇怪的错误。

我甚至做了一些测试,似乎cudaMalloc的第一次调用失败了。

2 个答案:

答案 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正确初始化。