指向设备对象成员的指针

Pointer to member of device object

本文关键字:成员 指针 对象      更新时间:2023-10-16

我知道,我不应该取消引用指向设备的指针。但以下是一个取消引用吗?

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(时,在主机代码中通常不可能直接从设备检索该数据。