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?
Potrebbe eventualmente mostrare del codice, è molto difficile commentare gli errori del compilatore astratto senza alcun contesto. – talonmies
C'è un codice collegato nella domanda: https://gist.github.com/1671571 –