6

我有一个函数指针数组,我用它来调用适当的cblas_xgemm(例如,cblas_dgemmcblas_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从一个标头获取功能之一,而从另一个标头获取另一个功能?还是我在处理一些奇怪的函数指针问题?

4

1 回答 1

1

您的问题似乎归结为这样一个事实,即您具有尝试从函数指针数组调用的不同签名的函数。我自己从来没有尝试过,但是从一点点研究来看,这似乎是不可能的。这是有道理的,因为静态类型语言将无法评估此操作的类型安全性。

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

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

另一方面,专栏专业是一个主要的痛苦。

于 2012-02-01T22:27:21.537 回答