CUDA: Comment faire valoir dans le code du noyau?
Quel est l'équivalent technique de affirmation dans CUDA noyau code?
Il ne semble pas être un faire valoir pour CUDA code du noyau. Je veux un moyen de rattraper les erreurs du développeur facilement dans le code du noyau. Un mécanisme où je peux mettre à jour les conditions pour être vrai et que le noyau doit renflouer lorsque la condition est fausse avec un message d'erreur.
Pouvez-vous affirmer en mode d'émulation?
jmilloy: mode d'Émulation n'est pas pris en charge dans CUDA 3.x.
Pour tout celui qui vient à travers ce par l'intermédiaire de Google, comme je l'ai fait, affirme dans le code du noyau sont désormais possibles: docs.nvidia.com/cuda/cuda-c-programming-guide/...
pourquoi ne postez-vous pas cela comme une réponse? Il est difficile de remarquer le commentaire: autres réponses distraire.
Ici c'est comme une réponse, mais même cela n'est pas accepté! Problème avec les anciennes questions, je crois, qui ont besoin de nouvelles réponses.
jmilloy: mode d'Émulation n'est pas pris en charge dans CUDA 3.x.
Pour tout celui qui vient à travers ce par l'intermédiaire de Google, comme je l'ai fait, affirme dans le code du noyau sont désormais possibles: docs.nvidia.com/cuda/cuda-c-programming-guide/...
pourquoi ne postez-vous pas cela comme une réponse? Il est difficile de remarquer le commentaire: autres réponses distraire.
Ici c'est comme une réponse, mais même cela n'est pas accepté! Problème avec les anciennes questions, je crois, qui ont besoin de nouvelles réponses.
OriginalL'auteur Ashwin Nanjappa | 2011-02-25
Vous devez vous connecter pour publier un commentaire.
Vous ne serez pas en mesure de retourner un message d'erreur code d'erreur ou de l'hôte à partir d'un noyau.
Au lieu de cela, je voudrais définir un état d'erreur et de le vérifier à partir de l'hôte. Dispositif d'utilisation de la mémoire globale ou (mieux) mappé en mémoire pour stocker un état d'erreur, passé comme un paramètre pour chaque noyau d'appel. Utiliser si les déclarations dans le noyau, et de si les déclarations d'échouer, de définir le code d'erreur et retour. Vous serez en mesure de vérifier le code d'erreur à partir de l'hôte après que le noyau d'appel, mais gardez à l'esprit que vous devrez synchroniser l'hôte et l'appareil après que le noyau de lancement avant de vérifier le code d'erreur. Je suppose que ce sera beau travail pour le développement, mais pas tellement pour la production.
Comme pour l'impression d'un message d'erreur directement à partir de l'appareil
OriginalL'auteur
Je tiens à souligner qu'une assertion peut se produire dans un seul thread, mais si vous décidez d'arrêter prématurément que le fil de son absense peut causer d'autres bugs (et probablement les autres affirme passe plus tard; peut-être aboutissant à un plantage du noyau et lâche de toutes les informations sur le GPU.
Aussi, la réponse donnée à " À l'aide d'affirmer au sein du noyau de l'invocation " ne fonctionne que si l'assertion est utilisé directement dans l' __ global__ fonction et pas plus profond, quelque part à l'intérieur __ device__ fonction.
Ma suggestion, c'est que même une assertion échoue, vous pouvez accéder normalement à votre code, mais laissez un message d'erreur. Vous pouvez utiliser mappé, épinglé mémoire (vous la carte d'hôte de la mémoire RAM dans GPU espace d'adressage) pour stocker les codes d'erreur/messages. De cette façon, même si le noyau se bloque et le GPU est remis à zéro, vous êtes susceptible d'obtenir de précieuses informations dans la mémoire mappée.
Si je ne me trompe pas, cartographié, épinglé mémoire est soutenu par presque tous les appareils de Calculer la Capacité de 1.1 et supérieur.
OriginalL'auteur
Vous pouvez trouver cela utile:
À l'aide d'affirmer au sein du noyau de l'invocation
Sinon, vous pouvez prendre cudaError à l'aide de cudaThreadSynchronize() qui vous donne plus de 40 raisons de noyau de retourner une erreur. Mais surtout, vous pouvez vérifier ces conditions à l'aide de if/else commandes dans le noyau.
eh bien, vous ne pouvez pas le printf du noyau et il n'y a pas moyen de contourner cela.
Pouvez-vous définir cudaError à une valeur personnalisée dans un noyau?
Fermi permet printf dans le noyau. D'autres que vous pouvez faire à votre custom enum et de retour que beaucoup de différentes erreurs que vous le souhaitez.
OriginalL'auteur