2012-01-23 19 views
5

Ho una matrice di puntatori di funzione che uso per chiamare l'appropriato cblas_xgemm (ad esempio, cblas_dgemm o cblas_sgemm, ecc., Da ATLAS/CBLAS).Perché cblas_dgemm e cblas_sgemm hanno tipi di puntatori diversi in una matrice di puntatore a funzione?

Funziona alla grande quando dico di usare cblas_dgemm con il puntatore di funzione; dgemm viene chiamato con gli argomenti appropriati e restituisce un risultato corretto.

Tuttavia, quando chiamo cblas_sgemm dal puntatore a funzione, ottengo il seguente output:

ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect 

Ho scritto un short test program che dimostra il problema. Le chiamate a cblas_sgemm senza il puntatore funzione funzionano correttamente.

Nota in particolare il seguente avviso gcc (si veda anche il senso linkato sopra, che ha l'uscita gcc completo):

test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default] 

Se io commento la linea cblas_sgemm nella definizione puntatore a funzione di matrice, non lo faccio ricevere questo avviso, anche per la linea cblas_dgemm. Ma questo non ha senso perché entrambe queste funzioni dovrebbero avere lo stesso tipo di ritorno!

Qui ci sono le righe appropriate da cblas.h:

void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
       const enum CBLAS_TRANSPOSE TransB, const int M, const int N, 
       const int K, const float alpha, const float *A, 
       const int lda, const float *B, const int ldb, 
       const float beta, float *C, const int ldc); 
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
       const enum CBLAS_TRANSPOSE TransB, const int M, const int N, 
       const int K, const double alpha, const double *A, 
       const int lda, const double *B, const int ldb, 
       const double beta, double *C, const int ldc); 

Quindi cosa succede? È in qualche modo ottenere una delle funzioni xgemm da un'intestazione e l'altra da un'altra? O sto affrontando qualche strano problema con il puntatore di funzione?

+0

Potrebbe eventualmente mostrare del codice, è molto difficile commentare gli errori del compilatore astratto senza alcun contesto. – talonmies

+0

C'è un codice collegato nella domanda: https://gist.github.com/1671571 –

risposta

1

La domanda sembra ridursi al fatto che si dispone di funzioni di firme diverse che si sta tentando di chiamare da una matrice di puntatore a funzione. Non l'ho mai provato da solo, ma da un po 'di ricerca, non sembra che sia possibile. Questo ha senso, dal momento che un linguaggio tipizzato staticamente non sarebbe in grado di valutare la sicurezza del tipo di questa manovra.

Ho visto suggerimenti sull'utilizzo di boost :: variant e altri metodi per questo, ma dal momento che si sta collegando a una libreria che non è la nostra conoscenza, non sono sicuro che ci sia molto valore nel perseguire tali opzioni.

Se si desidera provare o smentire, è possibile rimuovere CBLAS dal programma di test e implementare semplicemente una classe con più metodi di firma, che differiscono solo per il tipo di dati.

In una nota a margine, la colonna maggiore è un dolore grave.

+0

Puoi spiegare cosa intendi per firma? La mia comprensione era lo stesso tipo di ritorno e lo stesso tipo di argomento + numero => stessa firma. –

+0

Sì, sono d'accordo. Ma i tuoi tipi di parametri non sono gli stessi. Guarda beta. È un galleggiante nelle funzioni SGE e doppio nelle funzioni DGE. Recentemente ho lavorato con BLAS, ricordo vagamente che i tipi di dati con cui funzionano queste funzioni sono la differenza tra D prefisso (doppio) e S prefisso (sto indovinando il singolo, che diventa float quando si porta in C++). – Evan

+0

Oh mio Dio. Ho pensato di leggere quegli elenchi di argomenti così da vicino. Hai assolutamente ragione. Grazie mille. –