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