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:
- après avoir alloué un espace pour
cpu_points
, vous pouvez effectuer une autre allocation cudaMallocHost
sur cpu_points->Points
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.
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