cudaMemcpy 分段错误:洞察和故障排除
当 cudaMemcpy 对无效内存地址进行操作时,经常会出现“cudaMemcpy 分段错误”错误。为了深入研究这个问题,让我们重点关注发布的查询中的一个具体示例:
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost);
通过调查代码和调试信息,发现指针 Grid_dev->cdata[i] 为 NULL在设备上,在 cudaMemcpy 调用中取消引用时导致分段错误。
为什么取消引用设备指针失败
虽然可以在 cudaMemcpy 调用中使用设备指针,但必须记住该指针仅存储设备地址。为了访问设备上的实际数据,我们需要执行额外的 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。然后,我们cudaMemcpy A到主机。这确保我们捕获指针值而不是尝试直接取消引用它。
潜在的内存泄漏
如果指针 A 是,修改后的代码可能会导致内存泄漏数据复制操作后未释放。为了缓解这个问题,应该使用 cudaFree(A) 释放分配给 A 的内存。
以上是为什么 cudaMemcpy 在取消引用 NULL 设备指针时会导致分段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!