Mam tablicę wskaźników funkcji, której używam do wywoływania odpowiedniego cblas_xgemm
(np. cblas_dgemm
lub cblas_sgemm
itd. Z ATLAS/CBLAS).Dlaczego cblas_dgemm i cblas_sgemm mają różne typy wskaźników w tablicy wskaźników funkcji?
Działa to świetnie, gdy mówię, aby użyć cblas_dgemm
przez wskaźnik funkcji; dgemm zostanie wywołany z odpowiednimi argumentami i zwróci poprawny wynik.
Jednakże gdy zgłoszę cblas_sgemm
przez wskaźnik funkcji, pojawia się następujący komunikat:
ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect
Napisałem short test program który demonstruje problem. Połączenia z cblas_sgemm
bez wskaźnika funkcji działają poprawnie.
Uwaga zwłaszcza następujące gcc ostrzeżenie (patrz również sens umieszczonego powyżej, który ma pełną moc gcc):
test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default]
Gdybym zakomentować linię w definicji tablicy wskaźnik funkcji cblas_sgemm
, nie uzyskać takie ostrzeżenie, nawet dla linii cblas_dgemm
. Ale to nie ma sensu, ponieważ obie te funkcje powinny mieć ten sam typ zwrotu!
Oto odpowiednie linie z 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);
Więc co się dzieje? Czy w jakiś sposób można uzyskać jedną z funkcji xgemm
z jednego nagłówka, a drugą z innego? Czy mam do czynienia z jakimś dziwnym problemem dotyczącym wskaźnika funkcji?
Czy możesz pokazać kod, bardzo trudno jest komentować abstrakcyjne błędy kompilatora bez kontekstu. – talonmies
W pytaniu jest powiązany kod: https://gist.github.com/1671571 –