У меня есть массив указателей на функции, который я использую для вызова соответствующего cblas_xgemm
(например, cblas_dgemm
или cblas_sgemm
и т. Д. Из ATLAS / CBLAS).
Это прекрасно работает, когда яскажи ему использовать cblas_dgemm
по указателю на функцию;Dgemm вызывается с соответствующими аргументами и возвращает правильный результат.
Однако, когда я вызываю cblas_sgemm
по указателю на функцию, я получаю следующий вывод:
ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect
Iнаписали короткую тестовую программу , которая демонстрирует проблему. Вызовы cblas_sgemm
без указателя функции работают нормально.
Обратите особое внимание на следующее предупреждение gcc (см. также связанную с gist ссылку)выше, который имеет полный вывод gcc):
test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default]
Если я закомментирую строку cblas_sgemm
в определении массива указателя функции, я не получу такого предупреждения, даже для строки cblas_dgemm
,Но это не имеет смысла, поскольку обе эти функции должны иметь одинаковый тип возврата!
Вот соответствующие строки из 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);
Так что же дает?Это как-то получает одну из функций xgemm
из одного заголовка, а другую - из другого?Или я имею дело с какой-то странной проблемой с указателем на функцию?