如何在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
}
謝謝!
如何在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
}
謝謝!
每個線程都會收到相同的輸入參數,因此在這種情況下,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是可能的,但您將支付性能價格。
'''N'''表示什麼?每個數組的長度? –
你是否訪問每個塊的所有文本元素?你的內核配置如何? – pQB