Смотря на Справочник по API CUDA 5.5 и Руководство по программированию CUDA C кажется, что нет cudaCalloc()
эквивалент на GPU стандартной библиотеки C calloc()
.
cudaMalloc()
а потом cudaMemset()
?Действительно ли нет функциональности 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()
; или вы можете встроить предпочитаемую проверку ошибок непосредственно в макрос, если хотите. Увидеть этот вопрос об обработке ошибок.
Если вам нужен простой способ обнуления новых выделений, вы можете использовать thrust::device_vector
, который по умолчанию создает свои элементы. Для примитивных типов это такое же поведение, как calloc
,
Здесь нет calloc()
-подобная функциональность в CUDA Runtime API, а также другой низкоуровневый эквивалент. Вместо этого вы можете сделать следующее:
cudaMalloc(&ptr, size);
cudaMemset(ptr, 0, size);
обратите внимание, что это все синхронно. Есть cudaMemsetAsync()
ну, хотя, честно говоря, cudaMalloc()
В настоящее время они достаточно медленные, чтобы это не имело значения.