2010-10-21 24 views
5

Il semble que 2 millions de flotteurs ne devraient pas être un gros problème, seulement 8 Mo de 1 Go de RAM GPU. Je suis capable d'allouer autant de fois et parfois plus que cela sans aucun problème. J'obtiens CL_OUT_OF_RESOURCES quand je fais un clEnqueueReadBuffer, ce qui semble étrange. Suis-je capable de flairer où le problème a vraiment commencé? OpenCL ne devrait pas échouer comme ça à clEnqueueReadBuffer à droite? Il devrait être quand j'ai alloué les données correctement? Est-il possible d'obtenir plus de détails que le code d'erreur? Ce serait cool si je pouvais voir combien VRAM a été alloué lorsque OpenCL a déclaré CL_OUT_OF_RESOURCES.CL_OUT_OF_RESOURCES pour 2 millions de flotteurs avec 1 Go de VRAM?

Répondre

3

Toute la mémoire disponible ne peut pas nécessairement être fournie à une seule demande d'acquisition. Lisez la fragmentation du tas 1, 2, 3 pour en savoir plus sur les raisons pour lesquelles la plus grande allocation possible est celle du plus grand bloc contigu de mémoire et comment les blocs sont divisés en plus petits morceaux suite à l'utilisation de la mémoire.

Il est pas que la ressource est épuisée ... Il ne peut pas trouver une seule pièce assez grande pour satisfaire votre demande ...

+0

Cela a du sens, merci de le signaler. Existe-t-il un moyen d'analyser à quoi ressemble la fragmentation de la mémoire heap sur le GPU lorsque la panne est survenue? – smuggledPancakes

+0

Peut-être gDEBbugger? http://www.gremedy.com/ Je ne l'ai jamais utilisé. –

+0

D'une certaine façon, je doute que ce soit vraiment le problème, puisque la mémoire gpu ne devrait généralement pas être assez fragmentée pour cela. Après tout, 8 Mo n'est pas vraiment beaucoup sur une carte de 1 Go (d'autant que le pilote devrait être capable de tirer la mémoire actuellement inutilisée vers la mémoire principale) et les allocations de la mémoire gpu sont généralement relativement volumineuses. Il semble donc probable que vous soyez proche de la limite de mémoire si vous voyez de tels problèmes dus à la fragmentation et si c'est un système basé sur une carte graphique normale (par opposition à tesla) je doute que le conducteur n'intervienne pas à ce moment là (en tuant certains contextes). – Grizzly

5

De another source:

- appelez clFinish() vous permet de l'erreur état pour le calcul (plutôt que de l'obtenir lorsque vous essayez de lire des données).
- l'erreur "out of resources" peut également être provoquée par un timeout de 5s si la carte (NVidia) est également utilisée comme affichage
- elle peut également apparaître lorsque vous avez des erreurs de pointeur dans votre noyau.

Un suivi suggère l'exécution du noyau d'abord sur le CPU pour vous assurer ne pas faire mémoire hors limites accès.

7

Je viens d'avoir le même problème que vous aviez (m'a pris une journée entière à réparer). Je suis sûr que les gens avec le même problème trébucheront sur ceci, c'est pourquoi je poste à cette vieille question.

Vous n'avez probablement pas vérifié la taille maximale du groupe de travail du noyau .

Voici comment vous le faites:

size_t kernel_work_group_size; 
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL); 

Mes périphériques (2x NVIDIA GTX 460 & Intel CPU Core i7) prennent en charge une taille de groupe de travail maximum de 1024, mais le renvoie le code ci-dessus quelque chose autour de 500 quand je passe mon chemin Tracing kernel. Lorsque j'ai utilisé une taille de groupe de travail de 1024, il a manifestement échoué et m'a donné l'erreur CL_OUT_OF_RESOURCES.

Plus votre noyau devient complexe, plus la taille maximale du groupe de travail devient petite (ou du moins c'est ce que j'ai ressenti).

Edit:
Je viens de réaliser que vous avez dit "clEnqueueReadBuffer" au lieu de "clEnqueueNDRangeKernel" ...
Ma réponse était liée à clEnqueueNDRangeKernel.
Désolé pour l'erreur. J'espère que cela sera toujours utile à d'autres personnes.

+0

Hey merci. Tu as raison! J'utilisais la taille du groupe de travail de l'appareil au lieu de la taille du groupe de travail du noyau. Changé qui l'a réparé :). – Gamer

+0

Pas de problème. Je suis heureux d'avoir pu aider. : D – Tara

+1

Avait le même problème, merci! –

1

Les accès hors-limites dans un noyau sont généralement silencieux (car il n'y a toujours pas d'erreur lors de l'appel de mise en file d'attente du noyau).

Cependant, si vous essayez de lire le résultat du noyau plus tard avec un clEnqueueReadBuffer(). Cette erreur apparaîtra. Cela indique que quelque chose s'est mal passé pendant l'exécution du noyau.

Vérifiez le code de votre noyau pour les lectures/écritures hors-limites.