2011-06-29 47 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