cudaMemcpy Segmentation Fault: Insight and Troubleshooting
Ralat "cudaMemcpy segmentation fault" selalunya timbul apabila cudaMemcpy beroperasi pada alamat memori yang tidak sah. Untuk menyelidiki isu ini, mari fokus pada contoh khusus daripada pertanyaan yang disiarkan:
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost);
Setelah menyiasat kod dan maklumat nyahpepijat, didapati bahawa penunjuk Grid_dev->cdata[i] ialah NULL pada peranti, yang mengakibatkan kesalahan pembahagian apabila dinyahrujuk dalam cudaMemcpy panggilan.
Mengapa Menyahrujuk Penunjuk Peranti Gagal
Walaupun penunjuk peranti boleh digunakan dalam panggilan cudaMemcpy, adalah penting untuk diingat bahawa penuding hanya menyimpan alamat peranti. Untuk mengakses data sebenar pada peranti, kami perlu melakukan cudaMemcpy tambahan untuk menyalin nilai penuding daripada peranti ke penuding hos. Penunjuk hos ini kemudiannya boleh digunakan untuk mengakses data.
Kod Disemak untuk Menangani Isu Ini
Kod asal telah dipinda dengan pendekatan yang lebih sesuai:
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);
Di sini, kami memperuntukkan penunjuk terapung A pada peranti dan cudaMemcpy nilai Grid_dev->cdata[i] kepada A. Kemudian, kami cudaMemcpy A kepada hos. Ini memastikan bahawa kami menangkap nilai penuding daripada cuba menyahrujuknya secara langsung.
Potensi Kebocoran Memori
Kod yang diubah suai mungkin mengalami kebocoran memori jika penunjuk A adalah tidak dibebaskan selepas operasi penyalinan data. Untuk mengurangkan ini, memori yang diperuntukkan untuk A harus dikeluarkan menggunakan cudaFree(A).
Atas ialah kandungan terperinci Mengapa CudaMemcpy Menyebabkan Kerosakan Segmentasi Apabila Menyahrujuk Penunjuk Peranti NULL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!