CUDA выделяет память в функции __device__

Есть ли способ в CUDA выделить память в функции __device__? Я не мог найти примеров этого.

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

Ответ 1

В соответствии с http://developer.download.nvidia.com/compute/cuda/3_2_prod/toolkit/docs/CUDA_C_Programming_Guide.pdf вы должны использовать функции malloc() и free() в функции устройства.

Page 122

B.15 Динамическое распределение глобальной памяти void * malloc (size_t size); void free (void * ptr); динамически выделять и освобождать память из кучи фиксированного размера в глобальной памяти.

Пример, приведенный в руководстве.

__global__ void mallocTest()
{
    char* ptr = (char*)malloc(123);
    printf("Thread %d got pointer: %p\n", threadIdx.x, ptr);
    free(ptr);
}

void main()
{
    // Set a heap size of 128 megabytes. Note that this must
    // be done before any kernel is launched.
    cudaThreadSetLimit(cudaLimitMallocHeapSize, 128*1024*1024);
    mallocTest<<<1, 5>>>();
    cudaThreadSynchronize();
}

Вам нужен параметр компилятора -arch = sm_20 и карта, которая поддерживает архитектуру > 2x.