我有一个函数指针数组,用于调用适当的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函数,从另一个头获取另一个吗?还是我在处理一些奇怪的函数指针问题?
发布于 2012-02-01 22:27:21
您的问题似乎归结为这样一个事实:您有不同签名的函数,您正试图从函数指针数组中调用这些函数。我自己也没试过,但是从一些研究来看,这看起来是不可能的。这是有意义的,因为静态类型的语言无法评估这种策略的类型安全性。
我已经看到了使用boost::variant和其他解决方法的建议,但是由于您要链接到一个不是我们自己的库,所以我不确定使用这些选项有多大的价值。
如果要证明或反驳,可以从测试程序中删除CBLAS,并简单地实现一个具有多个签名方法的类,这些方法仅在数据类型上有所不同。
顺便说一句,专栏大调是一个主要的痛苦。
https://stackoverflow.com/questions/8979147
复制相似问题