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!