2011-01-17 12 views
10

Belleği __device__ işlevinde ayırmak için CUDA'da bir yol var mı? Bunu yaparken herhangi bir örnek bulamadım.CUDA belleği __device__ işlevine ayırma

Manüel: B.15 Dinamik Genel Bellek Ayırma void * malloc (size_t boyut); void free (void * ptr); , genel bellekteki sabit boyutlu bir yığıntan dinamik olarak bellek ayırır ve boş bırakır. CUDA in-kernel malloc() işlevi, aygıt yığınından en az boyut bayt ayırır ve ayrılan belleğe bir işaretçi veya isteği yerine getirmek için yetersiz bellek varsa NULL döndürür. Döndürülen göstericinin 16 baytlık bir sınırla hizalanması garanti edilir. CUDA in-kernel free() işlevi, bir önceki çağrıya malloc() tarafından döndürülen ptr ile gösterilen belleği ayırır. Ptr NULL ise, ücretsiz() çağrısı yoksayılır. Aynı ptr ile serbest() tekrarlanan çağrılar tanımsız bir davranışa sahiptir. Belirli bir CUDA iş parçacığı tarafından malloc() aracılığıyla ayrılan bellek, CUDA bağlamının ömrü boyunca veya serbest bir çağrıyla açık bir şekilde serbest bırakılıncaya kadar ayrılmış kalır(). Daha sonraki çekirdek açılışlarından bile herhangi bir CUDA iş parçacığı tarafından kullanılabilir. Herhangi bir CUDA iş parçacığı, başka bir iş parçacığı tarafından ayrılmış belleği boşaltabilir, ancak aynı işaretçinin bir kereden fazla serbest kalmamasını sağlamak için dikkatli olunmalıdır.

+0

Belleği dinamik olarak ayırmaya mı çalışıyorsunuz? – jmilloy

+0

Evet. Ben biraz egzotik bir gereksinim olduğunu anlıyorum ama ben malloc kullanıyorum ve __global__ işlevi ücretsiz iken, mevcut kod tabanı – SparcU

cevap

17

http://developer.download.nvidia.com/compute/cuda/3_2_prod/toolkit/docs/CUDA_C_Programming_Guide.pdf uyarınca, bir aygıt işlevinde malloc() ve ücretsiz() kullanabilmeniz gerekir.

Sayfa 122

B.15 Dinamik Genel Bellek Tahsisi geçersiz * malloc (size_t boyut); void free (void * ptr); , genel bellekteki sabit boyutlu bir yığıntan dinamik olarak bellek ayırır ve boş bırakır.

Kılavuzda verilen örnek.

__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(); 
} 

Sen -ARCH = sm_20 menü noktası derleyici ve> 2x mimarisini destekleyen bir kart gerekir.

+0

Hi @Nate, portu yapıyorum, bu bana derleme hataları malloc ana bilgisayar fonksiyonu ve çağrı diyemeyiz diyor derler cihaz. Bazı başlık dosyalarını kaçırıyor muyum? Gpu destekli mimariyi nasıl kontrol edeceğinizi biliyor musunuz? Teşekkürler! –