假如定义了一个三维的cudaArray A,维数是463,那么我可以分三次向A中拷贝数据吗?每次向里面拷贝4*6个数据。不知道是否可行,可以的话该怎么操作呢?
楼主你好,关于你第一个是否可行的疑问,答案是可行的。
关于你第二个问题,可如下:
(假设你有元素类型为int, 大小为(4,6,3)的cudaArray)
(假设你要从p0, p1, p2复制,他们均指向46sizeof(int)的缓冲区(例如int p0[4 * 6]))
struct cudaMemcpy3DParms params = {0};
params.dstArray = cuArray;
params.dstPos = make_cudaPos(0,0,0); //第一次复制的偏移(0,0,0)
params.extent = make_cudaExtent(4,6,1); //复制一个面(4,6,1)
params.srcPtr = make_cudaPitchedPtr(p0, 4 * sizeof(int), 4, 6); //从第0个缓冲区
params.kind = cudaMemcpyHostToDevice;
cudaMemcpy3D(& params);
params.dstPos = make_cudaPos(0,0,1); //第二次还是复制(4,6,1)大小,从(0,0,1)开始
params.srcPtr = make_cudaPitchedPtr(p1, 4 * sizeof(int), 4, 6); //从第1个缓冲区
cudaMemcpy3D(& params);
params.dstPos = make_cudaPos(0,0,2); //第三次还是复制(4,6,1)大小,从(0,0,2)开始
params.srcPtr = make_cudaPitchedPtr(p2, 4 * sizeof(int), 4, 6); //从第2个缓冲区
cudaMemcpy3D(& params);
注意每次复制需要更改偏移,分别是(0,0,0)、(0,0,1)、(0,0,2)。
你懂的。
–修正中文的写错
哦,原来是这样的,太感谢了,一直没有弄明白,现在终于懂了。
嗯。如同我在2楼的话,“我就知道你会懂”。