在 CUDA 程式設計中,「cudaMemcpy」函數用於在主機和裝置記憶體之間傳輸資料。但是,當使用「cudaMemcpy」呼叫(以裝置指標為目標)將資料從裝置記憶體複製到主機時,例如「cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size * sizeof (float ), cudaMemcpyDeviceToHost);",可能會出現分段錯誤。
嘗試存取無效記憶體時會觸發分段錯誤。在這種情況下,出現問題的原因是裝置指標「Grid_dev->cdata[i]」無法在主機程式碼的「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);
以上是為什麼帶有裝置指標的「cudaMemcpy」會導致分段錯誤,以及如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!