Doc*_*awk 6 c function-pointers lapack atlas
我有一个函数指针数组,我用来调用适当的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
Run Code Online (Sandbox Code Playgroud)
我写了一个简短的测试程序来演示这个问题.cblas_sgemm没有函数指针的调用工作正常.
请特别注意以下gcc警告(另请参阅上面链接的gist,它具有完整的gcc输出):
test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)
如果我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);
Run Code Online (Sandbox Code Playgroud)
什么给出了什么?它是以某种方式xgemm从一个标题获取其中一个函数而从另一个标题获取另一个函数?还是我处理一些奇怪的函数指针问题?
您的问题似乎可以归结为这样一个事实:您尝试从函数指针数组调用具有不同签名的函数。我自己从未尝试过,但从一点点研究来看,这似乎是不可能的。这是有道理的,因为静态类型语言无法评估此操作的类型安全性。
我已经看到了使用 boost::variant 的建议以及其他解决方法,但由于您链接到的库不是我们自己的,所以我不确定追求这些选项是否有多大价值。
如果您想证明或反驳,您可以从测试程序中删除 CBLAS,并简单地实现一个具有多种签名方法的类,这些方法仅在数据类型上有所不同。
顺便说一句,专栏专业是一个主要的痛苦。