2013-03-18 87 views
0

開發人員,使用動態共享內存分配時的正確內核調用

可能有人給我一個提示嗎? 我沒有找到任何有關如何在同一個內核中分配常量和動態共享內存的信息,或者可以更加珍貴地詢問: 如何調用內核,其中需要分配的共享內存量在編譯時部分已知時間?例如參考allocating shared memory,如何做動態分配變得非常明顯。 但是讓我們假設我有以下的內核:

__global__ void MyKernel(int Float4ArrSize, int FloatArrSize) 
{ 
    __shared__ float Arr1[256]; 
    __shared__ char Arr2[256]; 
    extern __shared_ float DynamArr[]; 
    float4* DynamArr1 = (float4*) DynamArr; 
    float* DynamArr = (float*) &DynamArr1[Float4ArrSize]; 

    // do something 
} 

內核調用:

int SharedMemorySize = Float4ArrSize + FloatArrSize; 

SubstractKernel<<< numBlocks, threadsPerBlock, SharedMemorySize, stream>>>(Float4ArrSize, FloatArrSize) 

實際上,我無法弄清楚編譯器是如何連接的大小共享內存只我想要動態分配的部分。或者參數「SharedMemeorySize」表示每塊的共享內存總量,所以我需要計算常量內存的大小(int SharedMemorySize = Float4ArrSize + FloatArrSize + 256 * sizeof(float)+ 256 * sizeof(char) )?

請賜教或只是指向一些代碼片段。 非常感謝。

歡呼聲格雷格

+0

OP!它只需要一個'__shared__'變量。嘗試將所有內容組合到一個結構中。 – 2013-03-18 16:52:45

+0

@SorooshBateni不,它不!內核調用中的參數隻影響動態分配的共享內存的大小,靜態分配的部分不會受到影響,並且很好。 – RoBiK 2013-03-18 17:15:29

+0

是的我說動態分配單元(:D)只需要一個'__shared__'變量。 – 2013-03-18 17:16:32

回答

2

引用編程指南SharedMemorySize指定共享內存中的字節數,除了靜態分配的內存之外,該字節還爲此調用每個塊動態分配一次;這個動態分配的內存被任何聲明爲外部數組的變量 使用。 SharedMemorySize是一個可選參數,默認爲0。

所以,如果我理解你想要做什麼,它或許應該像

extern __shared_ float DynamArr[]; 
float* DynamArr1 = DynamArr; 
float4* DynamArr2 = (float4*) &DynamArr[DynamArr1_size]; 

要知道,我沒有測試它。

Here是非常有用的帖子。

+0

謝謝,完美...現在我知道如何繼續! – GregPhil 2013-03-18 18:07:36

+0

不客氣@GregPhil。順便說一句,告訴別人在stackoverflow上感謝你的最好方式是對他/她的帖子進行投票,並且,如果存在,接受最合適的答案是有好習慣的。 – stuhlo 2013-03-19 20:06:45

1

CUDA programming guide

的〔內核]執行配置是通過插入的 表達形式< < < DG,DB中,Ns個,S >>>之間指定函數名稱和 括號參數列表,其中:

  • Ns是size_t類型,它指定共享內存中除了靜態分配的內存以外的每個塊爲此調用動態分配的字節數,其餘爲 ;這個動態的 被分配的內存由__shared__中提到的被聲明爲 外部數組的任何變量使用; Ns是可選的 參數,默認爲0;

因此,基本上,你的內核調用期間指定共享內存的大小是關係到dinamically分配的共享內存。您不必在共享內存中手動添加靜態分配數組的大小。

+0

非常感謝,這正是我想知道的! – GregPhil 2013-03-18 18:05:44