But de l’argument LDA dans BLAS dgemm?

La documentation d’implémentation de référence Fortran indique:

* LDA - INTEGER. * On entry, LDA specifies the first dimension of A as declared * in the calling (sub) program. When TRANSA = 'N' or 'n' then * LDA must be at least max( 1, m ), otherwise LDA must be at * least max( 1, k ). * Unchanged on exit. 

Cependant, étant donné m et k, ne devrais-je pas pouvoir dériver de LDA? Quand est-il permis à LDA d’être plus grand que n (ou k)?

La distinction est faite entre la taille logique des premières dimensions des tableaux A et B et la taille physique. Le premier est la taille du tableau que vous utilisez, le second est la valeur dans la déclaration ou la quantité de mémoire physique utilisée. Comme Fortran est une langue majeure de la colonne, la taille déclarée de tous les index, à l’exception du dernier, doit être connue afin de calculer l’emplacement d’un élément de tableau. Notez les déclarations de style FORTRAN 77 “A (LDA, ), B (LDB, ), C (LDC, *)”. La taille déclarée du tableau peut être supérieure à la partie que vous utilisez. bien sûr, il ne peut pas être plus petit.

Le paramètre LDA dans BLAS est effectivement la foulée de la masortingce telle qu’elle est aménagée en mémoire linéaire. Il est parfaitement valable d’avoir une valeur LDA supérieure à la dimension principale de la masortingce sur laquelle vous travaillez. Les cas typiques où il est utile ou nécessaire d’utiliser une valeur LDA plus grande sont lorsque vous travaillez sur une sous-masortingce à partir d’une masortingce dense plus grande et lorsque le matériel ou les algorithmes offrent des avantages en termes de performances lorsque le stockage est arrondi à des multiples d’une taille optimale ( les lignes de cache ou la taille de la transaction mémoire GPU, ou l’équilibre de charge dans les implémentations multi-processeurs, par exemple).

Une autre façon de voir les choses est que LDA est le y-ssortingde, ce qui signifie que dans une mise en page avec lignes majeures, l’adresse de l’élément A [y, x] est calculée sous la forme x + LDA * y. Pour une mise en mémoire “compactée” sans espaces entre les lignes adjacentes de données x LDA = xSize.