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指针,让我们调用它
myhostptr
cudaMalloc
int
存储在设备上myhostptr
cudaMemcpy的指针值的
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 关注
- 724 浏览
添加回答
举报