2017-09-06 4 views
1

J'ai construit du code C++ qui utilise OpenACC et l'a compilé avec le compilateur PGI pour l'utiliser sur le GPU Tesla.Débogage d'une erreur "adresse d'espace invalide"

La compilation réussit sans aucun avertissement.

je lance le programme et obtenir deux erreurs:

call to cuStreamSynchronize returned error 717: Invalid address space 
call to cuMemFreeHost returned error 717: Invalid address space 

L'Internet ne semble pas savoir beaucoup à ce sujet, autre que de suggérer enabling unified memory afin que le problème est balayé automatiquement sous le tapis. Je ne suis pas dans ce genre de solution.

Comment procéder pour le débogage? Avec le code C++ fonctionnant uniquement sur le CPU, je lance gdb, fais un backtrace, et dis, "Ah, ha!"

Mais maintenant j'ai le code vivant sur le CPU et le GPU et les données circulant entre les deux. Je ne sais même pas quels outils utiliser. Une solution de rechange consiste à commencer à commenter les lignes jusqu'à ce que le problème disparaisse, mais cela semble également sous-optimal.

Répondre

1

Vous pouvez utiliser "cuda-gdb" pour déboguer le code de l'appareil ou utiliser "cuda-memcheck" pour vérifier les erreurs de mémoire.

Bien que je ne sois pas sûr que ce soit utile ici. L'erreur indique que le code de périphérique émet une instruction en utilisant une adresse du mauvais espace mémoire. Par exemple, utiliser un pointeur de mémoire partagée avec une instruction qui attend un pointeur de mémoire globale.

Je n'ai pas vu cette erreur auparavant et je ne vois aucun rapport de bogue précédent pour celui-ci, donc je peux seulement théoriser quant à la cause. Une possibilité est si vous avez une variable de mémoire partagée (scalaire ou tableau dans une clause "private", ou directive "cache") qui est passée d'une boucle de gang externe à une routine de vecteur. Dans ce cas, la routine du vecteur peut accéder à la variable comme si elle se trouvait dans la mémoire globale.

Probablement quelle qu'en soit la cause, il s'agit d'une erreur de compilation. Si possible, veuillez poster ou envoyer au service clientèle de PGI ([email protected]) un exemple de reproduction et je le ferai parvenir à nos ingénieurs de compilation pour enquête.

Je peux aussi essayer de vous aider à mieux comprendre la cause. En attendant, vous pouvez essayer de compiler avec "-ta = tesla: nollvm, keepgpu". "nollvm" amènera le compilateur à générer une version CUDA C intermédiaire des noyaux OpenACC, par opposition au générateur de code de périphérique LLVM par défaut. "keepgpu" gardera le fichier intermédiaire ".gpu" que vous pouvez inspecter.

+0

Merci, Mat! Ce sera probablement quelques jours avant que j'arrive à tester ceci, mais j'ai envoyé un email avec le code fautif (qui est assez court pour être un exemple reproductible) à l'adresse que vous avez suggérée. – Richard

+0

Le problème est que vous avez une variable locale utilisée dans un atomique. Atomics autorise uniquement l'utilisation avec la mémoire partagée ou globale. Je vous ai envoyé un fichier source mis à jour avec les modifications suggérées pour résoudre ce problème et améliorer les performances de votre code. –

0

Il existe des variables d'environnement utiles qui facilitent le débogage. Toute combinaison peut être activée:

export PGI_ACC_TIME=1 #Profile time usage 
export PGI_ACC_NOTIFY=1 #Set to values 0-3 where 3 is the most detailed 
export PGI_ACC_DEBUG=1 #Extra debugging info