我已经开始编写新的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可能会返回以前异步调用的错误,如果这是您的失败所指。 –
你能包括一个小例子吗? –