cudaMemcpy 分段错误
调用 cudaMemcpy 将数据从设备传输到主机时,用户可能会遇到分段错误。这通常源于设备指针处理不当。
问题
以下代码演示了该问题:
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost);
这里,Grid_dev 是指向网格类对象的设备指针。尝试在 cudaMemcpy 调用中直接取消引用该指针可能会导致分段错误。
解决方案
要解决此问题,必须在主机上创建中间指针引用设备指针。以下代码概述了修改后的解决方案:
float * A; cudaMalloc((void**)&A, sizeof(float)); ... ... cudaMemcpy(&A, &(Grid_dev->cdata[i]), sizeof(float *), cudaMemcpyDeviceToHost); CurrentGrid->cdata[i] = new float[size]; cudaMemcpy(CurrentGrid->cdata[i], A, size*sizeof(float), cudaMemcpyDeviceToHost);
在此修改后的代码中,A 是最初指向设备指针的主机指针。通过使用 cudaMemcpy 将 Grid_dev->cdata[i] 的值复制到 A,我们有效地将设备指针传输到主机。随后,可以将CurrentGrid->cdata[i]分配给主机上的一个新的float数组,并且可以将数据从设备指针A复制到这个数组。
以上是为什么从设备复制到主机时'cudaMemcpy”会导致分段错误,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!