Operasi cudaMemcpy yang cuba memberikan nilai kepada penunjuk ahli kelas pada hos menyebabkan kesalahan pembahagian kerana penggunaan peranti yang salah penunjuk.
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float), cudaMemcpyDeviceToHost);
Penyelesaian melibatkan penyediaan penuding peranti dengan betul untuk digunakan pada hos. Daripada menyalin terus nilai penuding peranti kepada hos, penuding perantaraan pada hos diperlukan.
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);
Penunjuk peranti tidak boleh dinyahrujuk terus dalam panggilan cudaMemcpy pada hos. Sebaliknya, nilai penunjuk itu sendiri mesti disalin ke penunjuk perantaraan pada hos. Ini memastikan bahawa penuding hos menghala ke lokasi memori peranti yang sah di mana data boleh diakses.
Untuk mengelakkan kebocoran memori dan memastikan penggunaan penunjuk peranti yang betul dalam operasi cudaMemcpy, ia adalah penting untuk mengikuti prosedur yang betul untuk menyediakan ahli kelas dengan penunjuk pada peranti. Ini termasuk menggunakan penunjuk perantaraan pada hos untuk menyalin nilai penuding dan menggunakan penuding hos untuk operasi cudaMemcpy berikutnya yang melibatkan memori peranti.
Atas ialah kandungan terperinci Mengapa CudaMemcpy Menyebabkan Kesalahan Segmentasi Apabila Menugaskan kepada Penunjuk Ahli Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!