私は、適切なcblas_xgemm
(たとえば、cblas_dgemm
またはcblas_sgemm
など、ATLAS/CBLASなど)を呼び出すために使用する関数ポインタ配列を持っています。cblas_dgemmとcblas_sgemmは、関数ポインタ配列内で異なるポインタ型を持つのはなぜですか?
これは、関数ポインタによってcblas_dgemm
を使用するように指示するとうまくいく。 dgemmは適切な引数で呼び出され、正しい結果を返します。
ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect
私は、問題を示しshort test programを書かれている:私は関数ポインタでcblas_sgemm
を呼び出すとき
しかし、私は次の出力を取得します。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つのヘッダーから、もう1つを別のヘッダーから取得していますか?または私はいくつかの奇妙な関数のポインタの問題を扱っていますか?
いくつかのコードを表示する可能性がありますが、コンテキストがなくても抽象的なコンパイラエラーにコメントするのは非常に難しいです。 – talonmies
質問にリンクされたコードがあります:https://gist.github.com/1671571 –