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中文網其他相關文章!