J'ai un noyau qui fonctionne dans les versions de débogage mais échoue dans les versions de version. Je suspecte que je lis ou écris hors des limites, mais le vérificateur de mémoire de CUDA ne montre aucune erreur. Alors, je l'ai fait un test où je lecture et d'écriture hors des limites avec le noyau suivant:Quelle est la granularité du CUDA Memory Checker?
__global__ void addKernel(int *c, const int *a, const int *b)
{
int x[1];
for (int i(0); i < 100; ++i) {
x[i] = i;
}
int t(0);
for (int i(0); i < 100; ++i) {
t += x[i];
}
c[0] = t;
}
Le CUDA Memory Checker n'a pas pris le hors d'écritures hors limites et lit. J'ai été capable d'obtenir une écriture hors limites pour être détectée en augmentant la boucle à 1.000.000 rounds, ce qui a amené le noyau à faire une pause à i = 502.586 (2MB hors limites).
Est-ce la granularité attendue au cours de laquelle le vérificateur mémoire CUDA fonctionne et est-ce que je peux faire pour l'obtenir pour détecter de petites hors des limites écrit (de l'ordre de quelques octets?)
Peut-être que le compilateur fait une de ses optimisations incroyables? Le résultat est sommatif de i de 0 à 100. Que se passe-t-il, pass 100 est un paramètre du noyau (inconnu au moment de la compilation)? – pQB
Semblait improbable. Je l'ai essayé de toute façon, et ça n'a rien changé :) –