指向设备对象成员的指针

问题描述 投票:0回答:1

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

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))
c++ cuda
1个回答
1
投票

关于此:

float db = &p_e->b;

我无法想象C或C ++中实体的地址为float值的情况。因此,从语言角度来看,这没有任何意义。如果我们将其修改为:

float *db = &p_e->b;

这是一个明智的构造,尽管它是否“有用”取决于您打算如何使用它。获取位置p_e->b的地址需要获取p_e中包含的指针的值(主机内存中的位置,因此没有设备取消引用该位置),并向其中添加偏移量到位置b。宾语。该偏移量不涉及任何取消引用。只需检查类/结构定义即可计算得出。因此,这些都不需要对指针进行任何取消引用。

现在生成的指针(db)指向设备存储器中的某个位置,因此该指针仅应在设备代码中使用(取消引用)。但是您可以按值将该指针传递给CUDA内核,并明智地使用它。

如果您实际上打算用指针db指向的float内容填充值p_e->b,首先您的代码不会这样做,其次在主机代码中通常是不可能的。当使用b_e分配了基础基础结构指针(cudaMalloc)时,可以直接从设备中检索该数据。

© www.soinside.com 2019 - 2024. All rights reserved.