2011-01-17 36 views
10

Có cách nào trong CUDA phân bổ bộ nhớ trong hàm __device__ không? Tôi không thể tìm thấy bất kỳ ví dụ nào về việc này.CUDA cấp phát bộ nhớ trong hàm __device__

Từ hướng dẫn sử dụng: B.15 Phân bổ bộ nhớ động toàn cầu void * malloc (size_t size); void miễn phí (void * ptr); phân bổ và giải phóng bộ nhớ tự động từ một vùng nhớ có kích thước cố định trong bộ nhớ toàn cầu. Hàm CUDA trong hạt nhân malloc() phân bổ ít nhất kích thước byte từ vùng nhớ thiết bị và trả về một con trỏ tới bộ nhớ được phân bổ hoặc NULL nếu không đủ bộ nhớ để đáp ứng yêu cầu. Con trỏ trả về được đảm bảo được căn chỉnh với một ranh giới 16-byte. Hàm CUDA in-kernel free() deallocates bộ nhớ được trỏ tới bởi ptr, mà phải được trả về bởi một cuộc gọi trước đó đến malloc(). Nếu ptr là NULL, lệnh gọi free() bị bỏ qua. Các cuộc gọi lặp lại tới free() với cùng một ptr có hành vi không xác định. Bộ nhớ được cấp phát bởi một chuỗi CUDA đã cho qua malloc() vẫn được cấp phát cho toàn bộ thời gian của ngữ cảnh CUDA, hoặc cho đến khi nó được giải phóng một cách rõ ràng bằng một lời gọi đến free(). Nó có thể được sử dụng bởi bất kỳ chủ đề CUDA nào khác ngay cả khi khởi chạy hạt nhân tiếp theo. Bất kỳ chuỗi CUDA nào cũng có thể giải phóng bộ nhớ được phân bổ bởi một luồng khác, nhưng cần lưu ý để đảm bảo rằng cùng một con trỏ không được giải phóng nhiều lần.

+0

bạn đang cố gắng cấp phát bộ nhớ động? – jmilloy

+0

Có. Tôi hiểu rằng đó là một yêu cầu kỳ lạ nhưng tôi đang chuyển mã cơ sở hiện tại – SparcU

Trả lời

17

Theo http://developer.download.nvidia.com/compute/cuda/3_2_prod/toolkit/docs/CUDA_C_Programming_Guide.pdf bạn sẽ có thể sử dụng malloc() và miễn phí() trong chức năng thiết bị.

Trang 122

B.15 động toàn cầu Memory Allocation void * malloc (size_t size); void miễn phí (void * ptr); phân bổ và giải phóng bộ nhớ tự động từ một vùng nhớ có kích thước cố định trong bộ nhớ toàn cầu.

Ví dụ được đưa ra trong sách hướng dẫn.

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

Bạn cần trình biên dịch paramter -arch = sm_20 và thẻ hỗ trợ kiến ​​trúc 2x.

+0

Hi @Nate, khi tôi đang sử dụng malloc và miễn phí trên hàm __global__, nó cho tôi lỗi biên dịch nói rằng không thể gọi hàm máy chủ malloc và miễn phí thiết bị. Tôi có thiếu một số tập tin tiêu đề? Bạn có biết cách kiểm tra kiến ​​trúc hỗ trợ GPU không? Cảm ơn! –

Các vấn đề liên quan