2011-06-03 7 views
0

J'ai un code cuda qui passe par certaines FFT et d'autres opérations mathématiques, qui fonctionne sur des blocs de 2^n comme demandé par l'utilisateur. Le code fonctionne bien lors de la première exécution, mais après une exécution assez longue, il commence à échouer. Finalement, il arrivera au point où si je cours une taille de bloc plus grande que 2^ll, je ne reçois aucune donnée (tous les zéros). J'ai fait quelques tests en modifiant le code du noyau et d'après ce que je peux dire, le noyau ne s'exécute pas. J'essaie de comprendre pourquoi mon code cesse de produire des données après plusieurs itérations sur de grandes tailles de blocs.Le noyau cuda n'exécute pas ou ne renvoie pas d'erreur

Le problème semble à première vue être une fuite de mémoire. Je sais que je dois exécuter plusieurs itérations du traitement pour provoquer une erreur. Au début, seules les grandes tailles de blocs cesseront de fonctionner, mais plus je ferai d'itérations, plus la taille des blocs sera réduite. La raison pour laquelle je ne suis pas certain que le problème est la mémoire est que mon code fonctionnera pour une taille de bloc inférieure à 2^11 quel que soit le nombre d'itérations que je cours. Si c'était une simple fuite de mémoire, je m'attendais à ce que les symptômes s'aggravent progressivement jusqu'à ce que je ne puisse plus accéder à la mémoire de la carte.

J'ai également remarqué que des tailles de blocs plus grandes (à peu près équivalentes à la quantité de mémoire utilisée par chaque thread) ont tendance à faire échouer le programme plus tôt. Augmenter le nombre de blocs traités (c'est-à-dire le nombre de threads Cuda) ne semble pas affecter le moment où le code commence à échouer. Autant que je sache, aucun code d'erreur n'est retourné, le noyau ne semble pas s'exécuter du tout. Est-ce que quelqu'un peut suggérer ce que je suis à l'origine de ce problème? Je me contenterais de tout savoir sur la façon de déboguer du code sur le GPU ou de surveiller la disponibilité de la mémoire GPU.

+1

'cuda-gdb' et vérifiez vos statuts de retour – Anycorn

+0

cuda 4.0? ou des versions plus anciennes? –

+0

Je devrais utiliser la dernière version de cuda. J'ai aussi été bâclé avec ma terminologie. J'augmente ma taille de bloc, pas ma taille de fil, déjà. – drew

Répondre

0

Si vous avez besoin de plus de calculs, augmentez la taille de votre grille et non la taille de votre bloc de threads. Pour citer le guide de programmation CUDA 3.0 à la pg. 8, "Sur les GPU actuels, un bloc de thread peut contenir jusqu'à 512 threads ."

Cela signifie que threadIdx.x * threadIdx.y * threadIdx.z < = 512 à tout moment. Si vous maintenez cet invariant, est-ce que les choses fonctionnent?