2012-11-02 45 views
6

Tôi nhận thức được phân bổ động khi sử dụng mảng 1D, nhưng làm thế nào nó có thể được thực hiện khi các mảng 2D được sử dụng?Phân bổ động bộ nhớ chia sẻ GPU 2D

myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>(); 
     .... 

__global__ void myKernerl(){ 
__shared__ float sData[][]; 
    ..... 
} 

Nói rằng tôi muốn phân bổ một mảng bộ nhớ chia sẻ 2D:

__shared__ float sData[32][32]; 

Làm thế nào nó có thể được thực hiện tự động? sẽ là:

myKernel<<< blocks, threads, sizeof(float)*32*32 >>>(); 
+7

"mảng bộ nhớ 2D chia sẻ" tĩnh tuyên bố của bạn không phải là hai chiều, nó chỉ là bộ nhớ tuyến tính và trình biên dịch tạo ra hàng-chủ yếu truy cập để nó. Dựa trên số câu hỏi vô tận của bạn về mảng đa chiều, có lẽ đã đến lúc ngồi xuống với một số tài liệu tham khảo và tìm hiểu về cách mảng hoạt động trong C++ .. – talonmies

Trả lời

4

Như bạn đã viết một cách chính xác, bạn phải xác định kích thước của động phân bổ bộ nhớ chia sẻ trước mỗi kernel gọi trong cấu hình thực hiện (trong <<<blocks, threads, sizeofSharedMemoryinBytes>>>). Điều này chỉ định số byte trong bộ nhớ chia sẻ mà được cấp phát động cho mỗi khối cho cuộc gọi này ngoài bộ nhớ được phân bổ tĩnh. IMHO không có cách nào để truy cập bộ nhớ như mảng 2D, bạn phải sử dụng mảng 1D và sử dụng nó như 2D. Cuối cùng, đừng quên vòng loại extern. Vì vậy, mã của bạn sẽ trông như thế này:

sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float); 

    myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>(); 
    .... 

    __global__ void myKernerl() { 

     extern __shared__ float sData[]; 
     ..... 
     sData[dimX * y + x] = ... 
    } 
+0

Đó cũng là điều tôi nghĩ. – Ono

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