J'ai effectué quelques tests sur mon noyau qui utilise un cache constant. Si j'utilise 16.000 flotteurs (16.000 * 4KB = 64KB) alors tout se passe bien. Si j'utilise 16 200, ça fonctionne toujours bien. J'obtiens des erreurs dans mes résultats (pas à partir d'OpenCL) si j'utilise 16 400 flotteurs. Se pourrait-il que techniquement il y ait 64.x Ko de cache constant disponible? Devrais-je même faire confiance à mon code si j'utilise exactement 16 000 flotteurs? Habituellement, je m'attends à ce que le code se casse lorsque vous utilisez des éléments à la limite indiquée.Pourquoi mon noyau ne tombe-t-il pas en panne lorsque j'utilise un peu plus de 64 ko de cache constant? (OpenCL/CUDA)
Répondre
Vous pouvez et devez interroger ceci à l'aide de l'API OpenCL clGetDeviceInfo, avec le paramètre CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE. La spécification OpenCL 1.1 dit qu'une implémentation conforme doit fournir au moins 64K octets, ce qui est probablement ce que votre périphérique est en train de mettre en œuvre. Si vous dépassez cette limite, OpenCL devrait soit vous donner une erreur, soit vous déplacer de façon tranparente votre tableau constant dans un tableau de mémoire global pour vous.
Si cela ne retourne pas une erreur, mais vous donne de mauvais résultats, c'est un bug dans votre implémentation OpenCL. Pas trop surprenant, aucun d'eux n'est encore très mature. Vous devez absolument signaler le bug au vendeur. (Ce que je suppose est NVidia en raison de vos références à CUDA) (Après vous être assuré que vous avez installé la dernière version, bien sûr.)
Je n'ai même pas jeté un coup d'oeil aux spécifications GPU pour savoir quelles machines ont et n'ont pas de limites strictes de 64 Ko de mémoire constante; Je suppose que vous avez fait en sorte que c'est en fait la limite sur votre carte. J'ajouterai toutefois que généralement les GPU et leurs runtimes CUDA/OpenCL/ne sont pas très agressifs sur les erreurs de capture ou de signalisation, et ne font certainement pas d'effort pour échouer si des paramètres invalides sont utilisés. Bien que je ne l'aie jamais vu explicitement, je crois comprendre que c'est en partie pour éviter les frais généraux, mais surtout pour être aussi indulgent que possible; dans un jeu, il vaut mieux que le bras des monstres paraisse drôle pour quelques images que le jeu entier meurt parce que quelqu'un a fait un seul accès hors limites. Pour ceux qui font de la programmation GPGPU, c'est embarrassant - c'est à vous de vous assurer que tous vos paramètres et utilisations de la mémoire sont valides, et sinon, les résultats peuvent être bizarres: parfois ça marchera, et souvent habitude. Mais tel est le chemin des choses. Je ne compterais certainement pas sur des choses qui échoueraient de façon fiable, et de façon évidente et utile si vous dépassiez un peu la limite de mémoire.
Je dirais que les choses ne cessent d'améliorer la façon dont les GPU détectent et signalent les erreurs. Il est vrai que le jeu est plus tolérant mais CUDA/OpenCL sont largement utilisés en dehors des jeux. – Tom
Si votre GPU a 64 Ko de mémoire physique constante, il ne devrait pas être surprenant si votre code échoue lorsque vous essayez de dépasser cela. –
Quand vous dites "1kB", voulez-vous dire "1.000 B" ou "1.024 B"? Je suppose que c'est ici 64 ko = 65.536 ko = 16.384 ka 4 ... Un peu plus de 16.200 flotteurs, un peu moins de 16.400. – Schnouki
Schnouki votre droite, 16,384 est le plus élevé que je peux aller. Je reçois une erreur lorsque j'utilise un nombre supérieur à celui-ci. Merci pour la réponse exacte :) – smuggledPancakes