通过查看CUDA 5.5 API Reference和CUDA C Programming Guide,似乎没有cudaCalloc()
,这是标准C库的calloc()
的等效GPU。
cudaMalloc()
再打cudaMemset()
?答案 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()
目前还很慢,所以它并不重要。