我正在爲1024個矩陣運行適應度函數,每個矩陣都有自己的塊並且大小相同。每個塊都有n*n
個線程(矩陣的維度),並且需要共享內存,這樣我可以輕鬆地減少總和。但是,所有矩陣的維數n
在運行時間之前是可變的(即它可以手動更改,但總是2的乘方因此總和很簡單)。這裏的問題是共享內存必須使用常量分配,但我也需要從主機傳遞給內核的值。我在哪裏聲明維度n
,以便它對CPU可見(用於傳遞給內核)並可用於聲明共享內存的大小(在內核中)?CUDA在哪裏申明共享內存分配常量
我的代碼的結構是這樣的:
從main.cu
我調用內核:
const int num_states = 1024
const int dimension = 4
fitness <<< num_states, dimension * dimension >>> (device_array_of_states, dimension, num_states, device_fitness_return);
,然後在kernel.cu
我有:
__global__ void fitness(
int *numbers,
int dimension,
int num_states,
int *fitness_return) {
__shared__ int fitness[16]; <<-- needs to be dimension * dimension
//code
}
numbers
是表示1024點矩陣的陣列,dimension
是行和列的長度,num_states
是1024,fitness_return
我是一個長度爲1024的數組,它保存每個矩陣的適應值。在內核中,共享內存硬編碼爲dimension
的正方形(因此在此示例中dimension
爲4)。
在哪裏以及如何聲明dimension
,以便它可以用來分配共享內存以及調用內核,這樣我只需要在一個地方更新dimension
?謝謝你的幫助。
編輯我的答案。 – einpoklum
在使用之前在全局範圍聲明它。 –
模板參數是你的朋友在這種情況下 – talonmies