Почему cblas_dgemm и cblas_sgemm имеют разные типы указателей в массиве указателей на функции? - PullRequest
6 голосов
/ 24 января 2012

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

1 Ответ

1 голос
/ 02 февраля 2012

Ваш вопрос, кажется, сводится к тому, что у вас есть функции с разными сигнатурами, которые вы пытаетесь вызвать из массива указателей на функции. Я никогда не пробовал это сам, но после небольшого исследования, похоже, что это невозможно. Это имеет смысл, поскольку статически типизированный язык не сможет оценить безопасность типов этого маневра.

Я видел предложения по использованию boost :: Вариант и другие обходные пути для этого, но так как вы ссылаетесь на библиотеку, которая не является нашей известностью, я не уверен, что есть большая ценность в использовании этих опций.

Если вы хотите доказать или опровергнуть, вы можете удалить CBLAS из своей тестовой программы и просто внедрить класс с несколькими методами подписи, которые отличаются только типом данных.

С другой стороны, главная колонна - это сильная боль.

...