Donc, je lis un peu sur la programmation CUDA et GPU. J'ai remarqué quelques choses telles que l'accès à la mémoire globale est lent (donc la mémoire partagée devrait être utilisée) et que le chemin d'exécution des threads dans une chaîne ne devrait pas diverger.Résolution de problèmes impliquant des structures de données plus complexes avec CUDA
J'ai également examiné l'exemple de multiplication de la matrice (dense), décrit dans le manuel du programmeur et le nbody problem. Et l'astuce avec l'implémentation semble être la même: Disposer le calcul dans une grille (ce qui est déjà le cas pour la matrice mul); subdivisez ensuite la grille en petits carreaux; récupère les mosaïques dans la mémoire partagée et laisse les threads calculer le plus longtemps possible, jusqu'à ce qu'il ait besoin de recharger les données de la mémoire globale dans la mémoire partagée.
Dans le cas du problème Nbody le calcul pour chaque interaction corps-corps est exactement le même (page 682):
bodyBodyInteraction(float4 bi, float4 bj, float3 ai)
Il faut deux corps et un des vecteurs d'accélération. Le vecteur du corps a quatre composantes: la position et le poids. Lors de la lecture du document, le calcul est compris facilement.
Mais que se passe-t-il si nous avons un objet plus complexe, avec une structure de données dynamique? Pour l'instant, supposons simplement que nous avons un objet (similaire à l'objet corps présenté dans le document) qui a une liste d'autres objets attachés et le nombre d'objets attachés est différent dans chaque thread. Comment pourrais-je l'implémenter sans avoir à diverger les chemins d'exécution des threads? Je recherche également de la littérature qui explique comment différents algorithmes impliquant des structures de données plus complexes peuvent être implémentés efficacement dans CUDA.
Eh bien, je suppose que juste aller à sciencedirect.com et tapez cuda est un bon début. Au moins, j'ai lu des articles intéressants depuis que j'ai posé cette question. Merci pour votre réponse. – Nils