2013-05-31 61 views
2

我有一個關於CUDA C++編程的問題。我正在使用共享內存。但我需要更大的共享內存。所以我試圖重用共享內存。我的代碼如下:CUDA中的共享內存重新分配

__global__ void dist_calculation(...){ 

    .......... 
    { 
     //1st pass 
     __shared__ short unsigned int shared_nodes[(number_of_nodes-1)*blocksize]; 

     ............ 

    } 

    { 
     //2nd pass 
     __shared__ float s_distance_matrix[(number_of_nodes*(number_of_nodes-1))/2]; 

     ........ 
    } 
} 

共享內存無法同時容納shared_nodes和s_distance_matrix。但它可以分別容納(我已經測試過)。在第二遍中,程序無法識別shared_nodes(因爲它是從第一遍),但是向我顯示共享內存沒有足夠空間的錯誤。所以看起來,一些空間仍然分配給shared_nodes變量。是否有任何方法可以銷燬該分配(如cudaFree)?或任何其他建議?

+0

如果一號通功能和第二通功能不相關的對方,你可以試試分離這些功能。 – ardiyu07

回答

4

分配一個類型化的緩衝區大到足以容納任何陣列和重新解釋陣列的算法的每個通:

__global__ void dist_calculation(...) 
{ 
    const unsigned int num_bytes1 = sizeof(unsigned short) * (number_of_nodes-1) * block_size; 

    const unsigned int num_bytes2 = sizeof(float) * (number_of_nodes) * (number_of_nodes-1))/2; 

    const unsigned int num_shared_bytes = num_bytes1 > num_bytes2? num_bytes1: num_bytes2; 

    __shared__ char smem[num_shared_bytes]; 

    unsigned short *shared_nodes = reinterpret_cast<unsigned int*>(smem); 
    first_pass(shared_nodes); 

    float *distance_matrix = reinterpret_cast<unsigned int*>(smem); 
    second_pass(distance_matrix);  
} 
+0

非常感謝。 @jared。它解決了我的問題。 – user2026934