結構體可以同時包含host、device的指標嗎

一般我看到的做法都是創建host、device的結構再把device的結構傳到kernel中去使用

但是想把結構的初始化、H2D、D2H都寫成一個函式來處理減化主程式的程式碼,所以想把host、device的指標都包在一起

我找了相關的資料似乎沒有看到有人這樣用,我想請教一下

我宣告一個結構包含host、device的指標,配置好記憶體後在device的kernel中只使用d_data的指標不使用h_data

以下是我的虛擬碼

struct data
{
float *h_data;   //or sruct *h_struct
float *d_data;   //or sruct *d_struct
};

__global__ void kernel(data in)  
{
in.data[idx] = ... ;
}

int main()
{
data test;
malloc(data.h_data);
cudamalloc(data.d_data);
initial(data.h_data);
cudaMemcpy(data.h_data -> data.d_data);
kernel<<<>>>(data);
}

LZ您好:

这样是可以的,因为您在给kernel压参数的时候,只是将参数本身复制过去,此时并不管这个指针参数具体的指向。而在kernel中使用的时候,只要确实使用的是指向device端的地址的指针,并且已经申请好了空间,也是无问题的。

祝您好运~

楼主您好,显然是可以的:

(1)数据总是可以被存储的(您甚至可以在您的结构体内存储一个无效的指针)
(2)使用是否正确只在于您使用的场合(例如您如果在kernel内总是使用有效的设备指针,那么显然毫无问题)。

感谢您的来访。

感謝版主的回覆!!後來測試的確可以正常的運行!

不過稍微要注意的是__constant__ 變數不能包在struct中,我沒注意到這部分導致一直出錯。

LZ您好:

__constant__变量确实无法直接用的,这里隐含了__device__属性,是device端的全局变量,在host端是特殊处理,不能直接用的。

祝您好运~