Разве в CUDA нет API-вызова, похожего на calloc ()?

Смотря на Справочник по API CUDA 5.5 и Руководство по программированию CUDA C кажется, что нет cudaCalloc()эквивалент на GPU стандартной библиотеки C calloc().

  • Действительно ли нет функциональности API для выделения буфера, инициализированного для всех нулей?
  • Есть ли что-то лучшее, что я могу сделать, чем позвонить cudaMalloc() а потом cudaMemset()?

4

Решение

Действительно ли нет функциональности 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(); или вы можете встроить предпочитаемую проверку ошибок непосредственно в макрос, если хотите. Увидеть этот вопрос об обработке ошибок.

8

Другие решения

Если вам нужен простой способ обнуления новых выделений, вы можете использовать thrust::device_vector, который по умолчанию создает свои элементы. Для примитивных типов это такое же поведение, как calloc,

1

Здесь нет calloc()-подобная функциональность в CUDA Runtime API, а также другой низкоуровневый эквивалент. Вместо этого вы можете сделать следующее:

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

обратите внимание, что это все синхронно. Есть cudaMemsetAsync() ну, хотя, честно говоря, cudaMalloc()В настоящее время они достаточно медленные, чтобы это не имело значения.

0
По вопросам рекламы [email protected]