1

J'ai écrit un type de données dérivé pour stocker des matrices en bandes au format de stockage en diagonale compressée; en particulier, je stocke chaque diagonale de la matrice en bandes dans une colonne du tableau 2D cds(1:N,-L:U), où N est le nombre de lignes de la matrice pleine et L et U sont le nombre de diagonales inférieures et supérieures (this question comprend la définition de le type).Exécution du stockage de la matrice en bandes dans Fortran

J'ai également écrit une fonction pour effectuer le produit entre une matrice dans ce format CDS et un vecteur complet. Pour obtenir chaque élément du vecteur produit, on utilise les éléments de la ligne correspondante cds, qui ne sont pas contigus en mémoire, puisque le langage est Fortran. Pour cette raison, je me promenais si une meilleure solution serait de stocker les diagonales dans les lignes d'un tableau 2D cds2(-L:U,1:N), ce qui me semble assez raisonnable.

Au contraire here je lis

nous pouvons allouer pour la matrice A un tableau val(1:n,-p:q). La déclaration avec les cotes inversées (-p:q,n) correspond au format de bande LINPACK [132] qui, contrairement au stockage en diagonale compressée (CDS), ne permet pas une multiplication matrice-vecteur vectorisable efficacement si p + q est petit.

Ce qui est juste ce qui semble approprié à C à mon avis. Qu'est-ce que je rate?

EDIT

Le noyau des produits de routine de vecteur de matrice de l'exécution est le suivant

DO i = A%lb(1), A%ub(1) 
    CDS_mat_x_full_vec(i) = DOT_PRODUCT(A%matrix(i,max(-lband,lv-i):min(uband,uv-i)), & 
             & v(max(i-lband,lv):min(i+uband,uv))) 
END DO 

(où lv et uv sont utilisés pour prendre en compte le cas du vecteur indexé à partir d'un index autre que 1.) La matrice A est ensuite accédée par des lignes.

+1

Cela dépendra beaucoup de la façon dont la multiplication de la matrice accède aux lignes et aux colonnes. –

+0

Oui, d'après votre exemple, il semble que l'autre commande pourrait être plus rapide. Vous pouvez essayer et mesurer. Peut-être que l'autre bibliothèque le calcule différemment? –

Répondre

0

J'ai mis en œuvre le type dérivé qui stocke les diagonales dans un tableau val(-p:q,1:n) et il est plus rapide, comme je le supposais. Donc, je pense que le lien que j'ai référencé fait référence à un langage de stockage majeur en ligne comme C et non à une colonne majeure comme Fortran. (Ou il implémente le produit de la matrice d'une manière que je ne peux même pas imaginer.)