cudaMemcpy2D怎么会数据小的时候拷贝正确,数据大的时候崩溃

请问各位CUDA的高手们,cudaMemcpy2D怎么会数据小的时候拷贝正确,数据大的时候崩溃?以下是我的代码片段
nx =/1559/150;
ny =/6001/6001;

float**a= new float*[nx];
for(int row = 0; row < nx; ++row)
{
	a[row] = new float[ny];
	for(int col = 0; col < ny; ++col)
	{
		a[row][col] = (*_vData)[row][col];
	}
}
 size_t pitch = 0;

CUDA_SAFE_CALL(cudaMallocPitch((void **)&Gpudata, &pitch, ny*sizeof(float), nx));

//Copies a matrix from the memory* area pointed to by src to the memory area pointed to by dst
CUDA_SAFE_CALL(cudaMemcpy2D(Gpudata,pitch,a,nysizeof(float),nysizeof(float),nx,cudaMemcpyHostToDevice));

当我nx小于100的时候,运行是正确的,大于100时,则cudaMemcpy2D崩溃。

楼主,您的代码存在严重BUG.

可能是您没有理解2维数组的缘故。

主要问题出在这里,而不是cudaMallocPitch上,
a[row] = new float[ny]; //错误!

您在host上,不需要分配nx个缓冲区。您只需要分配一个大小为nx * ny * sizeof(float)字节的连续缓冲区。(此时pitch == ny * sizeof(float), 无额外的填充字节)

这是其一,
其二,上述说法是根据您的原文描述的,您还可能存在nx/ny颠倒的问题,这可能会造成逻辑上的问题以及运行时候的性能。但如果您故意如此设计的,请无视第二点。

祝好。

------------------分割线-------------------------
刚才还看到了您翻出来一个老帖子,"opengl和cuda互操作“的那个帖子,请也考虑下是否因为其他部分有问题(例如上文这种)而导致的那个帖子的问题,而不是opengl自身的问题。谢谢

cudaMemcpy2D操作的数据都是一维的,并不是二维的,你传入的a是二维,所以不对. cudaMemcpy2D中的2D只是表示:参数是C中的二维数组,而不是C++中的.

谢谢版主,我感觉就是貌似是只能分配一个nxnysizeof(float)字节的连续缓冲区的问题,所以,再请问一下,如果我传入的是float**的数组时,怎么快速的拷贝到GPU里呢?貌似只能在开始时转换成一维的连续缓冲区?

嗯嗯。如果你"真的"需要将多个指针指向的多个缓冲区,复制到(或者说,合并到)一个大的缓冲区去,那么我估计只能循环处理,将它们合并了。因为没有直接的合并多个缓冲区的函数。

谢谢了~我之前看到过一个帖子,他是直接把float** 拷贝到GPU了,并且经我测试,成功,当数据变大时,运行会出错。链接发表不了,CUDA与二维动态数组,在CSDN里的帖子~请问一下,是为什么?

您好,

(1)本帖已经在前置楼层讨论过如何将多个指针指向的缓冲区(即指针数组,对应您代码里的float **)。
(2)本帖已经在前置楼层建议过如何合并多个缓冲区到一个大缓冲区(循环复制合并)。
(3)本帖已经建议过您不需要多个缓冲区,您只需要一个nx * ny * sizeof(float)的大缓冲区。

我建议您采纳我的上述建议。
如果您决定不采纳上述三个建议,而要坚持模仿CSDN上的那个人的行为,请直接去询问该人。我尊重您的选择。

在除了上述3个建议外,我没有任何其他更多的建议了。
感谢您的来访。

谢谢版主,我没有仔细看以前的帖子,都是现学现用的~