Une opération cudaMemcpy tentant d'attribuer une valeur à un pointeur de membre de classe sur l'hôte a provoqué un défaut de segmentation dû à une mauvaise utilisation de l'appareil pointeurs.
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float), cudaMemcpyDeviceToHost);
La solution consiste à configurer correctement le pointeur de l'appareil pour une utilisation sur l'hôte. Au lieu de copier directement la valeur du pointeur de périphérique sur l'hôte, un pointeur intermédiaire sur l'hôte est requis.
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);
Les pointeurs de périphérique ne peuvent pas être déréférencés directement dans les appels cudaMemcpy sur l'hôte. Au lieu de cela, la valeur du pointeur elle-même doit être copiée vers un pointeur intermédiaire sur l'hôte. Cela garantit que le pointeur d'hôte pointe vers un emplacement de mémoire de périphérique valide où les données sont accessibles.
Pour éviter les fuites de mémoire et garantir une utilisation correcte des pointeurs de périphérique dans les opérations cudaMemcpy, il Il est important de suivre la procédure correcte pour configurer les membres de la classe avec des pointeurs sur l'appareil. Cela inclut l'utilisation de pointeurs intermédiaires sur l'hôte pour copier les valeurs du pointeur et l'utilisation du pointeur d'hôte pour les opérations cudaMemcpy ultérieures impliquant la mémoire de l'appareil.
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!