2012-09-12 59 views
0

可能重複:
Copying a struct containing pointers to CUDA device傳遞一個結構指針到一個CUDA內核

我有裝置指針的結構中,指向陣列設備上分配的。 這樣的

struct mystruct{ 

int* dev1; 
double* dev2; 
. 
. 
} 

在這個結構中有大量的數組。我開始編寫一個CUDA內核,其中 我將指針傳遞給mystruct,然後在 CUDA內核代碼中將其取消,如mystruct->dev1[i]

但是我在寫了幾行後意識到這是行不通的,因爲通過CUDA的第一原理 您不能在CUDA內核中取消主機指針(在本例中爲mystruct)。

但是這是不正確的,因爲我必須將更多的參數 傳遞給我的內核。有什麼辦法可以避免這種情況?我想保留我的內核調用的參數 儘可能短。

回答

0

您可以將您的mystruct結構複製到全局內存並將其設備地址傳遞給內核。但是,從性能角度來看,將mystruct存儲在常量內存中會更好,因爲(我猜)很多線程都有很多隨機讀取。

0

如果您的設置支持,您也可以使用頁面鎖定(固定)主機內存並在該區域內創建結構。請參閱CUDA programming guide的3.2.4。

+0

您的意思是映射主機內存,標記。頁面鎖定的主機內存不一定是映射的。 – harrism

2

正如我在this answer解釋,你可以按值傳遞你的結構的內核,所以你不必擔心提領一臺主機指針:

__global__ void kernel(mystruct in) 
{ 
    int idx = threadIdx.x + blockIdx.x * blockDim.x; 
    in.dev1[idx] *= 2; 
    in.dev2[idx] += 3.14159; 
} 

有傳遞結構的開銷按價值要知道。但是,如果你的結構不是太大,那應該沒關係。

如果您將相同的結構體傳遞給許多內核,或者反覆使用,您可以考慮將結構本身複製爲全局或常量內存,而不是像aland所建議的那樣,或者使用Mark Ebersole建議的映射主機內存。但是通過值來傳遞結構是一個更簡單的入門方法。

(注意:請在複製問題之前搜索StackOverflow ...)

相關問題