cudaMemcpy 操作尝试将值分配给主机上的类成员指针导致由于设备使用不当而导致的分段错误指针。
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float), cudaMemcpyDeviceToHost);
解决方案涉及正确设置设备指针以在主机上使用。不需要直接将设备指针的值复制到主机,而是需要主机上的中间指针。
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);
设备指针不能在主机上的 cudaMemcpy 调用中直接取消引用。相反,指针值本身必须复制到主机上的中间指针。这确保主机指针指向可以访问数据的有效设备内存位置。
为了避免内存泄漏并确保在 cudaMemcpy 操作中正确使用设备指针,它按照正确的步骤在设备上使用指针设置类成员非常重要。这包括使用主机上的中间指针来复制指针值,以及使用主机指针进行涉及设备内存的后续 cudaMemcpy 操作。
以上是为什么 cudaMemcpy 在分配给类成员指针时会导致分段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!