我在运行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。
我希望有人可以帮助我,我在这里非常困难。
答案 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
是主机指针,它是此操作的目标。