Почему cblas_dgemm и cblas_sgemm могут иметь разные типы указателей в массиве указателей на функции?

У меня есть массив указателей на функцию, который я использую для вызова соответствующего 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

Я написал короткую тестовую программу , которая демонстрирует проблему. Вызовы cblas_sgemm без указателя функции работают нормально.

Обратите особое внимание на следующее предупреждение gcc (см. Также приведенную выше суть, в которой содержится полный вывод 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 из одного заголовка, а другую - из другого? Или я столкнулся с какой-то странной проблемой с указателем на функцию?

6
задан Doctor Mohawk 24 January 2012 в 21:39
поделиться