2010-01-17 10 views

Répondre

3
#define MYASSERT(condition) \ 
    if (!(condition)) { return; } 

MYASSERT(condition); 

si vous avez besoin colombophile vous pouvez utiliser cuPrintf() qui est disponible sur le site CUDA pour les développeurs enregistrés.

+4

Il ne devrait pas être un point-virgule à la fin de la définition de macro - généralement l'utilisation de la macro aura que point-virgule. En outre, envisagez de l'implémenter comme suit pour éviter qu'il ne s'attache avidement à un mot clé 'else' qui pourrait précéder immédiatement:' if (condition)/* ne fait rien * /; else return' –

+2

Si vous avez un __syncthreads() à tout moment après cela, vous devez vous assurer que tous les threads atteignent la même décision sinon vous risquez d'avoir un interblocage. En outre, vous pouvez définir un indicateur booléen (par exemple 'bool Success' initialisé à true par l'hôte) dans la mémoire globale pour indiquer l'événement. Peu importe que plusieurs threads écrivent false dans le flag car ils écrivent toujours la même valeur et donc la course n'est pas pertinente. – Tom

+0

@Tom Ce n'est pas vrai. La mémoire globale n'a pas été conçue pour ce type d'utilisation, de sorte que le résultat de plusieurs threads écrivant simultanément dans la même position de mémoire globale est un comportement inattendu. – Auron

7

CUDA possède maintenant une fonction d'assertion native. Utilisez assert(...). Si son argument est zéro, il arrêtera l'exécution du noyau et retournera une erreur. (ou déclencher un point d'arrêt si le débogage CUDA est effectué.)

Assurez-vous d'inclure "assert.h". En outre, cela nécessite une capacité de calcul 2.x ou supérieure, et n'est pas supporté sur MacOS. Pour plus de détails, voir le guide de programmation CUDA C, Section B.16.

Le guide de programmation comprend également cet exemple:

#include <assert.h> 
__global__ void testAssert(void) 
{ 
    int is_one = 1; 
    int should_be_one = 0; 
    // This will have no effect 
    assert(is_one); 
    // This will halt kernel execution 
    assert(should_be_one); 
} 
int main(int argc, char* argv[]) 
{ 
    testAssert<<<1,1>>>(); 
    cudaDeviceSynchronize(); 
    return 0; 
} 
Questions connexes