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

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

Patricia Arquette
发布: 2024-12-03 21:47:12
原创
154 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板