cudaMemcpy无效的参数

时间:2014-12-14 22:24:55

标签: c++ cuda

我在运行cudaMemcpy时遇到了一些问题,无法从我的GPU中获取一些数据。 cudaErrorString是“无效参数”,它发生在从设备到主机的memcpy中。这是我的孤立代码:

//To render particles out of.
GLfloat* particleRenderData = new GLfloat[particleContainer.size() * 4];

//particlePosBuffer lives on GPU and is used to copy updated particle data
//Back to the OpenGL Buffer.
GLfloat *particlePosBuffer;
cudaStatus = cudaMalloc((void**)&particlePosBuffer, particleContainer.size() * sizeof(GLfloat)* 4);
CUDA_CHECK_STATUS;

//CalcBuffer is our points.  CUDA will modify it on GPU.
Point3D *calcBuffer;
cudaStatus = cudaMalloc((void**)&calcBuffer, particleContainer.size() * sizeof(Point3D));
CUDA_CHECK_STATUS;
cudaStatus = cudaMemcpy(calcBuffer, &particleContainer[0], particleContainer.size() * sizeof(Point3D), cudaMemcpyHostToDevice);
CUDA_CHECK_STATUS;

update << <1, 1 >> > (calcBuffer, particlePosBuffer, particleContainer.size(), 1.0);
cudaThreadSynchronize();

cudaStatus = cudaMemcpy(particlePosBuffer, particleRenderData, particleContainer.size() * sizeof(GLfloat)* 4, cudaMemcpyDeviceToHost);
CUDA_CHECK_STATUS;

particleContainer是Point3D类型的向量,它是我写的类。设备的第一个memcpy是成功的,我已经比较了主机和设备缓冲区以确保这一点。截至目前,更新可能不是问题。无论有没有,都会出现此问题。同样与同步。我尝试了很多不同的东西,包括将particlePosBuffer和renderData转换为void *,只传递引用,以及两者。

我在Visual Studio 2013中使用CUDA 6.5.GPU是gtx 770,我正在编译compute_30,sm_30。
我希望有人可以帮助我,我在这里非常困难。

1 个答案:

答案 0 :(得分:4)

你在这里遇到了问题:

cudaStatus = cudaMemcpy(particlePosBuffer, particleRenderData, particleContainer.size() * sizeof(GLfloat)* 4, cudaMemcpyDeviceToHost);

这是从设备到主机的转移。与memcpy一样,cudaMemcpy的第一个参数总是目标指针。所以你的前两个参数被反转了。它应该是这样的:

cudaStatus = cudaMemcpy(particleRenderData, particlePosBuffer, particleContainer.size() * sizeof(GLfloat)* 4, cudaMemcpyDeviceToHost);

particlePosBuffer是设备指针,它是此操作的

particleRenderData是主机指针,它是此操作的目标