[英]Pointer to member of device object
我知道,我不應該取消引用指向設備的指針。 但以下是取消引用嗎?
struct example{
int a;
float b;
};
void test(){
example* p_e;
cudamalloc(&p_e,sizeof(example));
float* db = &p_e->b; // is this line valid?
}
它在我的電腦上工作,但這有效嗎?
編輯:
有了它,我的意思是,它在我的測試運行中保持:
reinterpret_cast<void*>(&p_e->b) == reinterpret_cast<void*>(reinterpret_cast<unsigned char*>(p_e)+sizeof(int))
關於這一點:
float db = &p_e->b;
我無法想象 C 或 C++ 中實體的地址是float
值的情況。 所以從語言的角度來看,這是沒有意義的。 如果我們將其修改為:
float *db = &p_e->b;
這是一個明智的構造,盡管它是否“有用”取決於您打算如何使用它。 獲取位置p_e->b
的地址需要獲取包含在p_e
中的指針的值(主機內存中的一個位置,因此不會在那里進行設備解引用)並將對象內位置b
的偏移量添加到該值中。 該偏移量不涉及任何取消引用。 它可以簡單地通過檢查類/結構定義來計算。 所以這些都不需要對指針進行任何取消引用。
生成的指針 ( db
) 現在指向設備內存中的一個位置,因此該指針只能在設備代碼中使用(取消引用)。 但是您可以將該指針按值傳遞給 CUDA 內核並明智地“使用”它。
如果您實際上打算用指針p_e->b
指向的float
內容填充值db
,首先您的代碼不會這樣做,其次在主機代碼中通常不可能直接從設備,當使用cudaMalloc
分配基礎結構指針( b_e
)時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.