2015-08-25 1 views
1

J'utilise les fonctions suivantes pour inverser les matrices dans lapack:LAPACK: inversion d'une matrice sans pivotante

DGETRF() 
DGETRI() 

Cependant, la sous-routine DGETRF() considère un pivotement partiel. Question: Y a-t-il un autre sous-programme dans lapaquet/blas qui pourrait remplacer le DGETRF() sans aucun pivotement? Aussi, j'aimerais savoir s'il existe un sous-programme qui utilise l'élimination gaussienne pour l'inversion de la matrice au lieu de la décomposition LU.

+0

Pourquoi l'algorithme utilisé par une routine en conserve fait-il une différence? –

+0

Il fait la différence en raison de la performance. Les algorithmes de pivotement sont chers. En écrivant un algorithme d'élimination gaussienne pour l'inversion matricielle, j'ai pu obtenir près de 50% du temps de calcul des sous-programmes mentionnés. Comme BLAS et LAPACK ont été développés par des experts dans ce domaine, nous pensons que le paquet peut avoir des algorithmes plus rapides qui ne pivotent pas. –

Répondre

1

La liste des routines de calcul disponibles dans LAPACK peut être trouvée here - faites défiler vers le bas de la page, Tableau 2.8. Autant que je sache, toutes les méthodes pour les matrices générales utilisent la factorisation pour effectuer l'inversion. Donc, il n'y a pas de sous-programme qui utilise GE pour calculer inverse. En ce qui concerne le pivotement, je suppose qu'à moins que vous ne sachiez vraiment ce que vous faites, vous ne devriez probablement pas utiliser une méthode sans pivotement partiel. Le pivotement partiel n'est pas terriblement cher en termes de performance, mais offre des améliorations. numerical stability. Pour autant que je sache, l'élimination gaussienne est également généralement utilisée avec pivoting partielle. En particulier, l'algorithme se brise si un élément de la diagonale principale est nul (pour une raison évidente). De plus, si la valeur du pivot est maximisée, la précision numérique de la solution est généralement améliorée.

Si vous vous une amélioration des performances pour votre version GE sans faire pivoter c'est tout simplement parce que vous faites du commerce de précision/généralité de l'approche de la performance (qui à mon humble avis est un jeu juste quand vous vraiment savoir ce que vous faites et un cas d'utilisation spécifique à l'esprit, mais je peux voir pourquoi les auteurs de bibliothèque préfèrent avoir la mise en œuvre plus générique).

En aparté, si vous êtes dans le jeu de comparaison des performances je, pour faire bonne mesure comparer aux fonctions d'inversion de matrice à partir Intel's MKL et assurer que tous les drapeaux d'optimisation du compilateur sont correctement spécifiés (-O3 -march=native au moins) avant de tirer des conclusions.

1

Est-ce que votre code exploite le stockage matriciel C (en ligne)? LAPACK et BLAS utilisent le stockage Fortran (colonne). Cela pourrait faire une grande différence en termes de manque de cache.

Vos matrices sont-elles grandes (en cache)? Si c'est le cas, vous devez activer optimisation très agressive au niveau du compilateur. Surtout quand il s'agit de l'arithmétique à virgule flottante détendue et de la vectorisation SIMD. Si vos matrices sont grandes alors comme suggéré par paul-g utiliser plus rapidement BLAS au minimum et LAPACK du vendeur si disponible. Référence BLAS n'est pas optimisé pour le processeur, il s'agit simplement d'un code Fortran en stock.