Dalam pengaturcaraan CUDA, fungsi "cudaMemcpy" digunakan untuk memindahkan data antara hos dan memori peranti. Walau bagaimanapun, apabila menyalin data daripada memori peranti ke hos menggunakan panggilan "cudaMemcpy" dengan penuding peranti sebagai destinasi, seperti "cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], saiz * saiz (float), cudaMemcpyDeviceToHost);", kesalahan pembahagian mungkin berlaku.
Kesalahan segmentasi dicetuskan apabila percubaan dibuat untuk mengakses memori tidak sah. Dalam kes ini, isu timbul kerana penuding peranti "Grid_dev->cdata[i]" tidak boleh dinyahrujuk terus dalam panggilan "cudaMemcpy" daripada kod hos.
Untuk menyelesaikan isu ini, langkah tambahan diperlukan sebelum "cudaMemcpy" panggilan:
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);
Langkah tambahan ini memastikan bahawa nilai penunjuk, bukan nilai yang dinyahrujuk, disalin ke memori hos, oleh itu mengelakkan kesalahan pembahagian.
Penyelesaian ini mungkin memperkenalkan isu pengurusan memori yang berpotensi jika memori peranti "A" yang diperuntukkan tidak dibebaskan dengan betul. Untuk menangani perkara ini, langkah pembersihan perlu ditambahkan pada kod untuk membebaskan memori peranti yang diperuntukkan untuk "A" selepas operasi "cudaMemcpy".
Atas ialah kandungan terperinci Mengapakah `cudaMemcpy` dengan Penunjuk Peranti Menyebabkan Ralat Pembahagian, dan Bagaimana Ia Boleh Diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!