2012-01-23 20 views
5

私は、適切な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つを別のヘッダーから取得していますか?または私はいくつかの奇妙な関数のポインタの問題を扱っていますか?

+0

いくつかのコードを表示する可能性がありますが、コンテキストがなくても抽象的なコンパイラエラーにコメントするのは非常に難しいです。 – talonmies

+0

質問にリンクされたコードがあります:https://gist.github.com/1671571 –

答えて

1

あなたの質問は、関数ポインタ配列から呼び出そうとしている異なるシグネチャの関数があるという事実に気づいているようです。私はこれを自分で試みたことはありませんが、少しの研究から、これは可能なようには見えません。静的型付き言語は、この操作の型安全性を評価することができないため、理にかなっています。

私はboost :: variantやその他の回避策を使用することを提案していますが、私たちのyownではないライブラリにリンクしているので、これらのオプションを取得する価値はないと思います。

テストプログラムからCBLASを削除し、データ型だけが異なる複数のシグネチャメソッドを持つクラスを実装するだけで済みます。

メモでは、列の長さは大きな痛みです。

+0

署名の意味を説明できますか?私の理解は、同じ戻り型と同じ引数型+数値=>同じ署名でした。 –

+0

はい、私はそれに同意します。しかし、あなたのパラメータタイプは同じではありません。ベータを見てください。それはSGE機能の浮動小数点であり、DGE機能では2倍です。私は最近、BLASと一緒に作業しましたが、データ型がD接頭辞(Doubles)とS接頭辞の違いで動作することを漠然と思い出しています(私はC++に移植するとfloatに変わります)。 – Evan

+0

ああ私の良さ。私はこれらの議論リストを非常によく読んだと思った。あなたは絶対に正しいです。どうもありがとうございます。 –

関連する問題