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

Есть ли способ в 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 может освобождать память, выделенную другим потоком, но следует позаботиться о том, чтобы один и тот же указатель не освобождался более одного раза.


person SparcU    schedule 17.01.2011    source источник
comment
да. Я понимаю, что это немного экзотическое требование, но я портирую существующую базу кода.   -  person SparcU    schedule 20.01.2011


Ответы (1)


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

Стр. Решебника 122

B.15 Динамическое распределение глобальной памяти void * malloc (size_t size); свободный от пустоты (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.

person Nate    schedule 09.03.2011
comment
Привет, @Nate, когда я использую malloc и free для функции global, это дает мне ошибки компиляции, например, о том, что невозможно вызвать функцию хоста malloc и free с устройства. Мне не хватает файлов заголовков? Вы знаете, как проверить архитектуру, поддерживаемую графическим процессором? Спасибо! - person Charles Chow; 21.03.2015