Есть ли способ в CUDA динамически выделять память в функциях на стороне устройства? Я не мог найти никаких примеров этого.
Из руководства по программированию CUDA C:
B.15 Распределение динамической глобальной памяти
void* malloc(size_t size); void free(void* ptr);
динамически выделять и освобождать память из кучи фиксированного размера в глобальной памяти.
Функция CUDA в ядре
malloc()
выделяет как минимум размер байтов из кучи устройства и возвращает указатель на выделенную память или NULL, если памяти недостаточно для выполнения запроса. Возвращаемый указатель гарантированно выровнен по 16-байтовой границе.Встроенная в ядро функция CUDA
free()
освобождает память, на которую указываетptr
, которая должна была быть возвращена предыдущим вызовомmalloc()
. Еслиptr
равноNULL
, вызов free () игнорируется. Повторные вызовы free () с одним и тем же ptr имеют неопределенное поведение.Память, выделенная данным потоком CUDA через
malloc()
, остается выделенной на время существования контекста CUDA или до тех пор, пока она не будет явно освобождена вызовомfree()
. Он может использоваться любыми другими потоками CUDA даже при последующих запусках ядра. Любой поток CUDA может освобождать память, выделенную другим потоком, но следует позаботиться о том, чтобы один и тот же указатель не освобождался более одного раза.