2011-10-26 61 views
0

如何在cuda中的每個實例中將一個參數矢量作爲局部變量處理?如何爲Cuda中的每個內核創建一個本地參數矢量

__global__ void kern(char *text, int N){ 
//if i change text[0]='0'; the change only affects the current instance of the kernel and not the other threads 
} 

謝謝!

+1

'''N'''表示什麼?每個數組的長度? –

+0

你是否訪問每個塊的所有文本元素?你的內核配置如何? – pQB

回答

2

每個線程都會收到相同的輸入參數,因此在這種情況下,char *text在每個線程中都是相同的 - 這是編程模型的基本部分。由於指針指向全局內存,如果一個線程通過指針更改數據(即修改全局內存),則該更改會影響所有線程(忽略危險)。

這與標準C完全相同,除了現在您有多個線程通過指針訪問。換句話說,如果您修改標準C函數中的文本[0],則更改在函數外部可見。

如果我理解正確,請求每個線程都有text的本地副本。

__global__ void kern(char* text, int N) { 
    // If you have an upper bound for N... 
    char localtext[NMAX]; 
    // If you don't know the range of N... 
    char *localtext; 
    localtext = malloc(N*sizeof(char)); 

    // Copy from text to localtext 
    // Since each thread has the same value for i this will 
    // broadcast from the L1 cache 
    for (int i = 0 ; i < N ; i++) 
     localtext[i] = text[i]; 

    //... 
} 

請注意,我假設你有sm_20或更高版本:那麼解決辦法,如果你不想改變函數外部可見的是完全一樣的標準C。另外請注意,儘管在設備代碼中使用malloc是可能的,但您將支付性能價格。

+0

您不能在內核中調用主機函數。您的方法應該使用共享內存 – pQB

+2

@pQB:Fermi支持in-kernel malloc,這正是答案中指出的:'請注意,我假設您有sm_20或更高版本' – talonmies

+0

Tom:我的歉意。我比我讀得快。 @talonmies:感謝您的評論 – pQB

相關問題