2010-05-31 7 views
7

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

+0

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

Répondre

5

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.

11
+0

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

1

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.

0

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.