2011-11-21 12 views
31

FORTRAN stati di documentazione implementazione di riferimento:Scopo dell'argomento LDA in BLAS dgemm?

* 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. 

Tuttavia, data m e k non dovrei essere in grado di ricavare LDA? Quando è possibile che LDA sia più grande di n (o k)?

risposta

19

La distinzione è tra la dimensione logica delle prime dimensioni degli array A e B e la dimensione fisica. Il primo è la dimensione dell'array che si sta utilizzando, il secondo è il valore nella dichiarazione o la quantità fisica di memoria utilizzata. Poiché Fortran è una lingua principale della colonna, è necessario conoscere le dimensioni dichiarate di tutti gli indici tranne l'ultimo per calcolare la posizione di un elemento di matrice. Notare le dichiarazioni di stile FORTRAN 77 di "A (LDA, ), B (LDB,), C (LDC, *)". La dimensione dichiarata dell'array può essere maggiore della porzione che si sta utilizzando; ovviamente non può essere più piccolo.

32

Il parametro LDA in BLAS è effettivamente il passo della matrice così come è disposto nella memoria lineare. È perfettamente valido avere un valore LDA che è più grande della dimensione iniziale della matrice su cui si sta operando. I casi tipici in cui è utile o necessario utilizzare un valore LDA più ampio sono quando si opera su una sottomatrice da una matrice densa più grande e quando l'hardware o gli algoritmi offrono vantaggi in termini di prestazioni quando la memoria viene riempita a multipli rotondi di dimensioni ottimali (linee di cache o dimensioni della transazione della memoria GPU, o bilanciamento del carico in implementazioni multiprocessore, ad esempio).

4

Un altro modo per vederlo è LDA è la y-falcata, nel senso che in un layout di riga principale il tuo indirizzo per l'elemento A [y, x] è calcolato come x + LDA * y. Per un layout di memoria "pieno" senza spazi tra linee adiacenti di x-data LDA = xSize.