J'essaie d'accélérer certains calculs en utilisant OpenCL et une partie de l'algorithme consiste à inverser une matrice. Existe-t-il une bibliothèque open-source ou un code librement disponible pour calculer la factorisation de lu (lapack dgetrf et dgetri) de matrice ou d'inversion générale écrite en OpenCL ou CUDA? La matrice est réelle et carrée mais n'a pas d'autres propriétés spéciales à part cela. Jusqu'à présent, j'ai réussi à trouver seulement des implémentations d'opérations matricielles-vectorielles de base sur gpu. La matrice est plutôt petite, seulement environ 60-100 lignes et cols, donc elle pourrait être calculée plus rapidement sur cpu, mais elle est utilisée un peu au milieu de l'algorithme, donc je devrais la transférer à l'hôte, calculer l'inverse, puis transférez le résultat sur l'appareil où il est ensuite utilisé dans des calculs beaucoup plus importants.Inversion de matrice dans OpenCL
Répondre
Je n'ai pas d'implémentation dans Open CL, mais les deux "Numerical Recipes" et "Into to Applied Math" de Gil Strang ont d'excellentes explications qui seraient faciles à coder. "NR" a un code C que vous pouvez adapter.
calculer l'inverse
Ceci est incorrect. Vous ne calculez pas un inverse avec la décomposition LU, vous êtes en train de décomposer la matrice. Si vous vouliez l'inverse, vous auriez à faire une substitution vers l'avant avec une série de vecteurs unitaires. C'est une différence petite mais importante.
Regardez ViennaCL: http://viennacl.sourceforge.net/
C'est ce que je voulais. Le seul problème est que les noyaux pour la factorisation LU n'utilisent pas le pivotement, donc leurs performances peuvent être plutôt médiocres et numériquement instables pour certaines entrées. – buchtak
Je sais que c'est un peu en retard, mais si vous essayez de faire des calculs de la matrice sur une matrice qui est que petit (60-100 lignes), les calculs seront beaucoup plus rapides sur un processeur que sur un GPU en raison du temps nécessaire pour copier les informations de la mémoire principale vers la mémoire du GPU. Si vous voulez faire cela, je vous suggérerais d'utiliser un langage parallèle tel que OpenMP ou MPI car cela vous permettrait de paralléliser votre code pour accélérer les calculs sur le CPU.
La question originale (maintenant 7 ans) a été résolue 4 ans plus tard dans un paper describing matrix inversion in CUDA based on Gauss-Jordan. Il tente de répartir les calculs entre différents threads et fournit des indications de performances détaillées pour les matrices d'une taille allant jusqu'à 2048.
Bien que n'étant pas OpenCL, les idées générales se traduira de CUDA assez facilement.
- 1. Multiplication et inversion de la matrice iPhone
- 2. Inversion de contrôle pour votre conteneur Inversion de contrôle?
- 3. Bit Inversion
- 4. Le moyen le plus simple d'effectuer une inversion de matrice modulaire avec Python?
- 5. Inversion de contrôle dans les compilateurs
- 6. OpenCL ou OpenGL - lequel utiliser?
- 7. Exécution d'une analyse dans OpenCL
- 8. NHibernate avec inversion de contrôle
- 9. MASM inversion de la chaîne
- 10. Gestion de la mémoire dans OpenCL
- 11. Inversion d'une image
- 12. Inversion de chaîne en Python
- 13. mod_rewrite inversion params
- 14. inversion des nombres binaires dans Haskell
- 15. OpenCL Texture Memory
- 16. Débogueur pour OpenCL
- 17. Mix OpenCL avec OpenGL
- 18. Exemples OpenCL avec benchmarks
- 19. Plusieurs noyaux OpenCl
- 20. OpenCL for Python
- 21. Comment utiliser la mémoire locale dans OpenCL?
- 22. Comment définir des fonctions dans OpenCL?
- 23. Inversion d'une chaîne en C
- 24. dépendances Isoler sans inversion de contrôle
- 25. Inversion de dictionnaire sur place en Python
- 26. Erreur de segmentation inversion d'une chaîne littérale
- 27. Linux Interception de fonction pour OpenCL
- 28. Mode de calcul exclusif avec OpenCL + NVidia
- 29. OpenCL et GPU programmation Roadmap
- 30. GPGPU, OpenCL, CUDA, ATI Stream
Vous devez également noter que l'inversion d'une matrice peut être une opération coûteuse, en particulier pour les grandes matrices, et très souvent, il existe une autre façon de résoudre le problème. La décomposition LU est un "bloc de construction" qui peut être utilisé pour éviter de faire un vrai inverse. – Tom