2010-10-08 9 views
0
struct d_struct { 
// stuff 
}; 

__device__ __constant__ d_struct structs[SIZE]; 

Quand j'appellemémoire CUDA constante de symbole invalide

cudaMemcpyToSymbol("structs", &h_struct, sizeof(d_struct), index * sizeof(d_struct), cudaMemcpyHostToDevice) 

sur une d_struct "h_struct" dans la mémoire hôte, je reçois une erreur invalid device symbol cuda.

+0

version/système d'exploitation? Assurez-vous également que la taille de la structure totale est inférieure à la taille de la mémoire constante. – fabrizioM

Répondre

1

Si vous pouvez fournir plus de détails, cela vous aidera, par exemple sur quelle plate-forme travaillez-vous et quelle version du compilateur hôte? Quelle version de la boîte à outils CUDA? Quel appareil?

En attendant, quelques suggestions:

  • Assurez-vous que vous utilisez la dernière boîte à outils CUDA. À ce moment, 3.1 est en cours et 3.2 est un candidat à la publication
  • Si vous utilisez Windows dans l'assistant CUDA, essayez de basculer vers les fichiers de règles standard fournis par NVIDIA
  • Comptez-vous pour la capacité de calcul correcte? Vérifiez simplement que vous ne compilez pas pour sm_13 et que vous utilisez sm_12 par exemple
  • Appellez-vous cudaMemcpyToSymbol() à partir du même fichier où la constante a été déclarée? Sinon, cela devrait fonctionner puisque la recherche est faite par nom plutôt que par symbole, mais vérifiez que vous ne l'avez pas déclaré comme extern "C" et que vous appelez depuis C++
  • Étant donné que vous avez oublié beaucoup de code il est préférable de vérifier - d_struct n'est pas modélisé, n'est-ce pas?
-2

En CUDA Programming Guide v4.2 D.2.2.1, il est dit que

Le __device__, __shared__ et __constant__ qualificatifs ne sont pas autorisés sur:

  • class, struct et union membres de données, Paramètres officiels,
  • variables locales dans une fonction qui s'exécute sur l'hôte.
+2

Ceci n'est pas un membre de structure de données, c'est un tableau de structures. – harrism