首页 >后端开发 >C++ >为什么从设备复制到主机时'cudaMemcpy”会导致分段错误,如何修复?

为什么从设备复制到主机时'cudaMemcpy”会导致分段错误,如何修复?

Patricia Arquette
Patricia Arquette原创
2024-12-03 21:47:12154浏览

Why Does `cudaMemcpy` Cause a Segmentation Fault When Copying from Device to Host, and How Can I Fix It?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn