1 回答
TA贡献1818条经验 获得超8个赞
我相信我知道问题是什么,但要确认它,看看你用来Grid_dev在设备上设置类的代码会很有用。
当要在设备上使用类或其他数据结构时,该类中有指针指向内存中的其他对象或缓冲区(可能在设备内存中,对于将在设备上使用的类),使这个顶级类在设备上可用的过程变得更加复杂。
假设我有一个这样的类:
class myclass{
int myval;
int *myptr;
}我可以在主机上实例化上面的类,然后malloc是一个数组,int并指定指针myptr,一切都会好的。要使此类仅在设备和设备上可用,过程可能类似。我可以:
cudaMalloc指向将保持的设备内存的指针
myclass(可选)
myclass使用cudaMemcpy将主机上的实例化对象复制到步骤1中的设备指针在设备上,使用
malloc或new分配设备存储myptr
如果我从不想访问myptr在主机上分配的存储空间,则上面的顺序很好。但如果我确实希望从主机可以看到该存储,我需要一个不同的序列:
cudaMalloc是一个指向设备内存的指针
myclass,让我们调用它mydevobj(可选)使用cudaMemcpy
myclass将主机上的实例化对象复制到mydevobj步骤1中的设备指针在主机上创建一个单独的int指针,让我们调用它
myhostptrcudaMalloc
int存储在设备上myhostptrcudaMemcpy的指针值的
myhostptr从主机到设备的指针&(mydevobj->myptr)
之后,您可以cudaMemcpy通过嵌入指针指向myptr分配(通过cudaMalloc)的区域指向的数据myhostptr
请注意,在步骤5中,因为我正在获取此指针位置的地址,所以此cudaMemcpy操作仅需要mydevobj主机上的指针,该指针在cudaMemcpy操作中有效(仅限)。
myint然后将正确设置设备指针的值以执行您尝试执行的操作。如果你想要cudaMemcpy数据进出myint主机,你可以myhostptr在任何cudaMemcpy调用中使用指针,而不是 mydevobj->myptr。如果我们尝试使用mydevobj->myptr,则需要解除引用mydevobj,然后使用它来检索存储在其中的指针,myptr然后使用该指针作为复制到/来自位置。这在主机代码中是不可接受的。如果你试图这样做,你会得到一个seg错误。(注意,通过类比,我mydevobj就像你Grid_dev,我myptr就像你一样cdata)
- 1 回答
- 0 关注
- 809 浏览
添加回答
举报
