gpt4 book ai didi

c++ - CUDA 在内核中对在主机上创建的对象调用虚拟方法

转载 作者:行者123 更新时间:2023-11-28 07:45:16 25 4
gpt4 key购买 nike

我的问题的描述在下面的这段代码中。

class A
{
public :
__device__ __host__ virtual void foo() = 0;
__device__ __host__ void foo2()
{
//something to do...
}
};

class B : public A
{
public :
__device__ __host__ B()
{ }
//implementing virtual method foo from A
void foo()
{
//something to do...
}
};

__global__ void Test(A* ptr_device)
{
ptr_device->foo2(); //it's okey
ptr_device->foo(); //ERROR !!!
}

void main()
{
B* b_host = new B();

A* a_host = (A*)malloc(sizeof(A));
memcpy(a_host, b_host, sizeof(A));

a_host->foo();
a_host->foo2();
//it's okey

A* a_device;
cudaMalloc((void**)&a_device, sizeof(A));
cudaMemcpy(a_device, a_host, sizeof(A), cudaMemcpyHostToDevice);
Test<<<1, 1>>>(a_device);
}

问题是当我想在内核上调用 A 类的虚方法时。首先我创建一个对象 B,然后为 A 对象分配空间并将 B 复制到 A。在主机代码上它工作正常但在设备代码中它在调用 foo 方法时出错

最佳答案

你不能只是 memcpy 非 POD 对象并期望它们工作,你在这里调用了相当多的 UB。

在您的情况下发生的情况很可能是该对象具有一些被复制的虚拟表指针,但在其他执行环境中没有任何意义,因为它几乎肯定不会指向存在于那里的虚拟表(在那里给出)甚至是一个)。

关于c++ - CUDA 在内核中对在主机上创建的对象调用虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15024920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com