Rumah >pembangunan bahagian belakang >C++ >Mengapakah `cudaMemcpy` Menyebabkan Ralat Segmentasi Apabila Menyalin dari Peranti ke Hos, dan Bagaimana Saya Boleh Membetulkannya?

Mengapakah `cudaMemcpy` Menyebabkan Ralat Segmentasi Apabila Menyalin dari Peranti ke Hos, dan Bagaimana Saya Boleh Membetulkannya?

Patricia Arquette
Patricia Arquetteasal
2024-12-03 21:47:12206semak imbas

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

Kesalahan Segmentasi cudaMemcpy

Apabila memanggil cudaMemcpy untuk memindahkan data dari peranti ke hos, pengguna mungkin menghadapi masalah pembahagian. Ini selalunya berpunca daripada pengendalian penunjuk peranti yang tidak betul.

Isunya

Kod berikut menunjukkan isu tersebut:

cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\
                cudaMemcpyDeviceToHost);

Di sini, Grid_dev ialah penunjuk peranti ke objek kelas grid. Percubaan untuk menyahrujuk langsung penuding ini dalam panggilan cudaMemcpy boleh menyebabkan kesalahan pembahagian.

Penyelesaian

Untuk menyelesaikan isu ini, penunjuk perantaraan mesti dibuat pada hos untuk merujuk penunjuk peranti. Kod berikut menggariskan penyelesaian yang disemak:

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);            

Dalam kod yang diubah suai ini, A ialah penuding hos yang pada mulanya menghala ke penuding peranti. Dengan menyalin nilai Grid_dev->cdata[i] ke A menggunakan cudaMemcpy, kami memindahkan penuding peranti ke hos dengan berkesan. Selepas itu, CurrentGrid->cdata[i] boleh diberikan kepada tatasusunan apungan baharu pada hos dan data boleh disalin daripada penuding peranti A kepada tatasusunan ini.

Atas ialah kandungan terperinci Mengapakah `cudaMemcpy` Menyebabkan Ralat Segmentasi Apabila Menyalin dari Peranti ke Hos, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn