CUDA真的没有calloc() - 就像API调用一样吗?

时间:2014-01-20 12:10:52

标签: c++ c cuda calloc memset

通过查看CUDA 5.5 API ReferenceCUDA C Programming Guide,似乎没有cudaCalloc(),这是标准C库的calloc()的等效GPU。

  • 是否真的没有用于分配初始化为全零的缓冲区的API功能?
  • 我能做些什么比打电话给cudaMalloc()再打cudaMemset()
  • 更好

3 个答案:

答案 0 :(得分:8)

  

是否真的没有用于分配初始化为全零的缓冲区的API功能?

确实没有。

  

我能做些什么更好的cudaMalloc()后跟cudaMemset()吗?

你可以使用一个宏,如果这是一个方便的问题(你没有告诉我们你的意思更好,如果第一个问题的答案是否定的):

#define cudaCalloc(A, B, C) \
    do { \
        cudaError_t __cudaCalloc_err = cudaMalloc(A, B*C); \
        if (__cudaCalloc_err == cudaSuccess) cudaMemset(*A, 0, B*C); \
    } while (0)

上面的宏可以使用我经常进行的错误检查(基于使用cudaGetLastError();或者如果你愿意,可以直接在宏中建立首选错误检查。参见{{3关于错误处理。

答案 1 :(得分:1)

如果您想要的只是将新分配归零的简单方法,则可以使用thrust::device_vector,默认构造其元素。对于原始类型,这与calloc的行为相同。

答案 2 :(得分:0)

CUDA Runtime API中没有类似calloc()的功能,也没有其他低级别的等效功能。相反,您可以执行以下操作:

cudaMalloc(&ptr, size);
cudaMemset(ptr, 0, size);

请注意,这都是同步的。还有一个cudaMemsetAsync(),但坦率地说,cudaMalloc()目前还很慢,所以它并不重要。