Défaut de segmentation cudaMemcpy : aperçu et dépannage
L'erreur « Défaut de segmentation cudaMemcpy » se produit souvent lorsque cudaMemcpy fonctionne sur des adresses mémoire non valides. Pour approfondir ce problème, concentrons-nous sur un exemple spécifique de la demande publiée :
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost);
Après avoir étudié le code et les informations de débogage, il a été découvert que le pointeur Grid_dev->cdata[i] était NULL. sur l'appareil, ce qui entraînait une erreur de segmentation lors du déréférencement dans l'appel cudaMemcpy.
Pourquoi le déréférencement Échec des pointeurs de périphérique
Bien que les pointeurs de périphérique puissent être utilisés dans les appels cudaMemcpy, il est impératif de se rappeler que le pointeur ne stocke que l'adresse de l'appareil. Pour accéder aux données réelles sur l'appareil, nous devons effectuer un cudaMemcpy supplémentaire pour copier la valeur du pointeur de l'appareil vers un pointeur hôte. Ce pointeur d'hôte peut ensuite être utilisé pour accéder aux données.
Code révisé pour résoudre ce problème
Le code d'origine a été modifié avec une approche plus appropriée :
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);
Ici, nous attribuons un pointeur float A sur l'appareil et cudaMemcpy la valeur de Grid_dev->cdata[i] vers A. Ensuite, nous cudaMemcpy A vers l'hôte. Cela garantit que nous capturons la valeur du pointeur plutôt que d'essayer de la déréférencer directement.
Fuite de mémoire potentielle
Le code modifié peut entraîner une fuite de mémoire si le pointeur A est non libéré après l'opération de copie des données. Pour atténuer cela, la mémoire allouée à A doit être libérée à l'aide de cudaFree(A).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!