Question

J'implémente actuellement un raytracer.Étant donné que le lancer de rayons est extrêmement lourd en calcul et que je vais de toute façon me pencher sur la programmation CUDA, je me demandais si quelqu'un avait une expérience dans la combinaison des deux.Je ne peux pas vraiment dire si les modèles informatiques correspondent et j'aimerais savoir à quoi m'attendre.J'ai l'impression que ce n'est pas exactement un match parfait, mais une augmentation de vitesse décente serait mieux que rien.

Était-ce utile?

La solution

Une chose dont il faut se méfier dans CUDA est que le flux de contrôle divergent dans votre code noyau TUE absolument les performances, en raison de la structure du matériel GPU sous-jacent.Les GPU ont généralement des charges de travail massivement parallèles avec des données avec un flux de contrôle hautement cohérent (c'est-à-direvous disposez de quelques millions de pixels, dont chacun (ou au moins de grandes parties) sera exploité par le exact même programme de shader, prenant même la même direction à travers toutes les branches.Cela leur permet de procéder à certaines optimisations matérielles, comme n'avoir qu'un seul cache d'instructions, une seule unité de récupération et une logique de décodage pour chaque groupe de 32 threads.Dans le cas idéal, courant en graphisme, ils peuvent diffuser la même instruction aux 32 ensembles d'unités d'exécution dans le même cycle (c'est ce qu'on appelle SIMD, ou Single-Instruction Multiple-Data).Ils peuvent imiter MIMD (Multiple-Instruction) et SPMD (Single-Program), mais lorsque les threads au sein d'un Streaming Multiprocessor (SM) divergent (en sortant différents chemins de code d'une branche), la logique d'émission bascule en fait entre chaque chemin de code lors d'un cycle. -base de cycle.Vous pouvez imaginer que, dans le pire des cas, où tous les threads se trouvent sur des chemins séparés, votre utilisation matérielle a simplement été réduite d'un facteur 32, éliminant ainsi tout avantage que vous auriez eu en fonctionnant sur un GPU sur un CPU, en particulier si l'on considère la surcharge associée au regroupement de l'ensemble de données du CPU, via PCIe, vers le GPU.

Cela dit, le lancer de rayons, bien que parallèle aux données dans un certain sens, a un flux de contrôle très divergent pour des scènes même modestement complexes.Même si vous parvenez à cartographier un groupe de rayons étroitement espacés que vous projetez les uns à côté des autres sur le même SM, les données et la localité des instructions dont vous disposez pour le rebond initial ne tiendront pas très longtemps.Par exemple, imaginez les 32 rayons hautement cohérents rebondissant sur une sphère.Ils iront tous dans des directions assez différentes après ce rebond et heurteront probablement des objets fabriqués à partir de matériaux différents, avec des conditions d'éclairage différentes, etc.Chaque matériau et ensemble d'éclairage, d'occlusion, etc.conditions est associé à son propre flux d'instructions (pour calculer la réfraction, la réflexion, l'absorption, etc.), et il devient donc assez difficile d'exécuter le même flux d'instructions, même sur une fraction significative des threads d'un SM.Ce problème, avec l'état actuel de la technique du code de lancer de rayons, réduit l'utilisation de votre GPU d'un facteur 16 à 32, ce qui peut rendre les performances inacceptables pour votre application, surtout si elle est en temps réel (par ex.un jeu).Il pourrait toujours être supérieur à un processeur, par exemple.une ferme de rendu.

Il existe une classe émergente d’accélérateurs MIMD ou SPMD actuellement étudiée par la communauté des chercheurs.Je les considérerais comme des plates-formes logiques pour les logiciels, le lancer de rayons en temps réel.

Si vous êtes intéressé par les algorithmes impliqués et par leur mappage au code, consultez POVRay.Examinez également le mappage de photons, c'est une technique intéressante qui se rapproche encore plus de la représentation de la réalité physique que le lancer de rayons.

Autres conseils

Cela peut certainement être fait, cela a été fait et c'est un sujet brûlant actuellement parmi les gourous du raytracing et de Cuda.Je commencerais par parcourir http://www.nvidia.com/object/cuda_home.html

Mais c'est fondamentalement un problème de recherche.Les gens qui réussissent bien en tirent des articles de recherche évalués par des pairs.Mais Bien à ce stade, cela signifie toujours que les meilleurs résultats GPU/Cuda sont à peu près compétitifs avec les meilleures solutions sur CPU/multi-core/SSE.Je pense donc qu'il est un peu tôt pour supposer que l'utilisation de Cuda va accélérer un traceur de rayons.Le problème est que bien que le lancer de rayons soit « embarrassant et parallèle » (comme on dit), ce n'est pas le genre de problème de « taille d'entrée et de sortie fixe » qui correspond directement aux GPU - vous voulez des arbres, des piles, des structures de données dynamiques, etc. .Cela peut être fait avec Cuda/GPU, mais c'est délicat.

Votre question n'était pas claire sur votre niveau d'expérience ou les objectifs de votre projet.S'il s'agit de votre premier traceur de rayons et que vous essayez simplement d'apprendre, j'éviterais Cuda - cela vous prendra 10 fois plus de temps à développer et vous n'obtiendrez probablement pas une bonne vitesse.Si vous êtes un programmeur Cuda moyennement expérimenté et que vous recherchez un projet stimulant et que le lancer de rayons est juste une chose amusante à apprendre, essayez par tous les moyens de le faire dans Cuda.Si vous créez une application commerciale et que vous cherchez à obtenir un avantage concurrentiel en termes de vitesse, eh bien, c'est probablement une merde à ce stade...vous pourriez obtenir un avantage en termes de performances, mais au prix d'un développement plus difficile et d'une dépendance à l'égard d'un matériel particulier.

Revenez dans un an, la réponse peut être différente après une ou deux générations supplémentaires de vitesse GPU, de développement du compilateur Cuda et d'expérience dans la communauté de recherche.

Nvidia a présenté un traceur de rayons dans CUDA lors de sa conférence NVision cette année.Voici un lien vers leurs diapositives à ce sujet.

http://www.nvidia.com/object/nvision08-IRT.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top