簡體   English   中英

指向設備對象成員的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM