0

Je n'arrive pas à savoir quel est le problème. Je reçois une erreur "accès violation d'écriture emplacement" dans la dernière ligne. Est-ce que je n'alloue pas correctement la mémoire?CUDA: pointeur vers l'accès à la mémoire du pointeur

typedef struct { 
    doubleXYZW cen_sum; //struct with 4 doubles 
    double STS[6]; 
    XYZW *Points;// //struct with 4 floats 
}BUNDLE; 

BUNDLE *cpu_data = NULL; 
size_t bundle_size = NUM_POINTS * sizeof(XYZW) + sizeof(doubleXYZW) + 6*sizeof(double); 
HANDLE_ERROR(cudaMallocHost((BUNDLE**)&cpu_data, bundle_size)); 
//error in the next line 
cpu_data->Points[0].x = 0; //x is the first element in the XYZW struct 

Répondre

2

Vous avez 2 allocations qui doivent être effectuées, et vous en effectuez seulement une.

Vous allouez du stockage pour le pointeur cpu_data, mais vous n'avez alloué aucun stockage pour le pointeur Points. Par conséquent, lorsque vous déréférencer Points:

cpu_data->Points[0].x = 0; 
     ^ ^
     |  this dereferences the Points pointer (NOT allocated!) 
     | 
     this dereferences the cpu_data pointer (allocated) 

vous déréférencement d'un pointeur que vous ne l'avez pas affecté, il est donc invalide. Tenter d'accéder à quelque chose de cette manière générera un accès invalide.

Vous avez (au moins) deux options pour le fixer:

  1. après avoir alloué un espace pour cpu_points, vous pouvez effectuer une autre allocation cudaMallocHost sur cpu_points->Points
  2. Si vous connaissez la taille de la Points array (il semble que vous faites - NUM_POINTS) vous pourriez simplement allouer statiquement pour elle:

    typedef struct { 
    doubleXYZW cen_sum; //struct with 4 doubles 
    double STS[6]; 
    XYZW Points[NUM_POINTS];// //struct with 4 floats 
    }BUNDLE; 
    

Notez que votre calcul bundle_size est conçu de telle sorte que la 2ème méthode est suggérée. Si vous utilisez la première méthode, votre calcul bundle_size est incorrect. Dans tous les cas, avec l'une ou l'autre des méthodes, il est plus facile de calculer bundle_size que sizeof(BUNDLE). Pour être clair, il n'y a rien de spécifique à CUDA ici (l'erreur serait présente par exemple si vous utilisiez malloc au lieu de cudaMallocHost). Le problème est enraciné dans la compréhension de base de C, pas CUDA.

+0

Merci pour la leçon détaillée. Ca a du sens. Je n'ai évidemment pas implémenté ce niveau de complexité dans C donc je l'ai rencontré avec CUDA. Comme vous l'avez suggéré, la deuxième option convient bien, elle permet aussi d'économiser du temps d'allocation. – Nenu