首頁 >後端開發 >C++ >為什麼從裝置複製到主機時「cudaMemcpy」會導致分段錯誤,如何修復?

為什麼從裝置複製到主機時「cudaMemcpy」會導致分段錯誤,如何修復?

Patricia Arquette
Patricia Arquette原創
2024-12-03 21:47:12149瀏覽

Why Does `cudaMemcpy` Cause a Segmentation Fault When Copying from Device to Host, and How Can I Fix It?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn