適切なものを呼び出すために使用する関数ポインター配列がありますcblas_xgemm
(たとえば、ATLAS/CBLAS からのcblas_dgemm
orなど)。cblas_sgemm
これは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
あるヘッダーから関数の1つを取得し、別のヘッダーから別の関数を取得していますか? または、奇妙な関数ポインターの問題に対処していますか?