首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么cblas_dgemm和cblas_sgemm在函数指针数组中有不同的指针类型?

为什么cblas_dgemm和cblas_sgemm在函数指针数组中有不同的指针类型?
EN

Stack Overflow用户
提问于 2012-01-23 21:53:49
回答 1查看 2.1K关注 0票数 7

我有一个函数指针数组,用于调用适当的cblas_xgemm (例如,cblas_dgemmcblas_sgemm,从ATLAS/CBLAS)。

当我告诉它使用cblas_dgemm的函数指针时,这是很好的;dgemm会使用适当的参数进行调用,并返回正确的结果。

但是,当我按函数指针调用cblas_sgemm时,会得到以下输出:

代码语言:javascript
复制
ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect

我编写了一个 短测试程序 ,它演示了这个问题。没有函数指针的调用cblas_sgemm很好。

请特别注意以下gcc警告(另见上面链接的要点,其输出为gcc ):

代码语言:javascript
复制
test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default]

如果我在函数指针数组定义中注释掉了cblas_sgemm行,就不会收到这样的警告,甚至对于cblas_dgemm行也是如此。但这是没有意义的,因为这两个函数都应该具有相同的返回类型!

下面是来自cblas.h的适当行

代码语言:javascript
复制
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函数,从另一个头获取另一个吗?还是我在处理一些奇怪的函数指针问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-01 22:27:21

您的问题似乎归结为这样一个事实:您有不同签名的函数,您正试图从函数指针数组中调用这些函数。我自己也没试过,但是从一些研究来看,这看起来是不可能的。这是有意义的,因为静态类型的语言无法评估这种策略的类型安全性。

我已经看到了使用boost::variant和其他解决方法的建议,但是由于您要链接到一个不是我们自己的库,所以我不确定使用这些选项有多大的价值。

如果要证明或反驳,可以从测试程序中删除CBLAS,并简单地实现一个具有多个签名方法的类,这些方法仅在数据类型上有所不同。

顺便说一句,专栏大调是一个主要的痛苦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8979147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档