gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:26:14 35 4
gpt4 key购买 nike

我有一个函数指针数组,我用它来调用适当的 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

我写了一个short test program这说明了问题。调用 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 函数,而另一个从另一个标题中获取?还是我在处理一些奇怪的函数指针问题?

最佳答案

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

我看到过使用 boost::variant 的建议,以及其他变通方法,但是由于您链接到的库不是我们自己的,所以我不确定追求这些选项是否有多大值(value)。

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

旁注,专栏专业是一个主要的痛苦。

关于c - 为什么 cblas_dgemm 和 cblas_sgemm 在函数指针数组中有不同的指针类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8979147/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com