我是C编码的新手,但我编写了一个用于模拟神经网络的Matlab程序,我希望将其转换为C代码,因为我们的超级计算机集群不允许同时运行多个Matlab仿真.为此,我发现GotoBLAS可以处理矩阵数学.
不幸的是我不知道如何使用它,因为我没有很多C和使用外部库的经验.我假设'dgemm'是GotoBLAS中的一个函数,从阅读BLAS指南pdf.我已经能够成功编译GotoBLAS,但是当我这样做时:
gcc -o outputprog main.c -Wall -L -lgoto2.a
Run Code Online (Sandbox Code Playgroud)
我收到消息:
undefined reference to 'dgemm'
Run Code Online (Sandbox Code Playgroud)
根据我的理解,我应该包括一些.h来自GotoBLAS的文件(或者可能不是),但我不确定哪一个(或者这是否正确).
任何帮助都将不胜感激.如果需要更多信息,请与我们联系.
一个问题可能是该-L选项需要在其后面有一个"目录"名称,因此gcc(或由其调用的链接器gcc)将其-lgoto2.a视为目录.编译器不会抱怨不存在的目录; 它只是忽略了它们.您希望在哪个目录中找到该库?(为了这个答案的目的,我会假设它在/usr/local/lib.)
另一个问题可能是该库未被称为libgoto2.aa或libgoto2.a.so或类似的东西.您通常不会指定.a后缀.(出于本答案的目的,我假设该库是libgoto2.a或libgoto2.so.)
您似乎无需指定标头的位置; 这意味着它们处于一个足够传统的位置,编译器无论如何都会看到它.如果这是正确的,那么库也可能处于足够传统的位置,并且该-L选项可能是不必要的.
所以,你可以使用:
gcc -Wall -o outputprog main.c -lgoto2
Run Code Online (Sandbox Code Playgroud)
或者您可能需要使用:
gcc -Wall -o outputprog main.c -L/usr/local/lib -lgoto2
Run Code Online (Sandbox Code Playgroud)
在评论中进行了一些广泛的讨论之后,以及库在当前目录中并且命名libgoto2.a并且符号dgemm仍然缺失的信息,我下载了GotoBLAS2版本1.13并尝试在半支持平台上编译它(MacOS X,可能假装是Linux,使用x86_64架构).构建不是完全成功的 - 一些汇编代码中的问题.然而,在标题处徘徊,有一个看起来像是给你的问题的解决方案:
cblas.h
Run Code Online (Sandbox Code Playgroud)
在此,在许多其他函数定义中,我们发现:
void cblas_dgemm(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA,
enum CBLAS_TRANSPOSE TransB, blasint M, blasint N, blasint K,
double alpha, double *A, blasint lda, double *B, blasint ldb,
double beta, double *C, blasint ldc);
Run Code Online (Sandbox Code Playgroud)
标题中的所有函数符号都以前缀为前缀cblas_.您的代码应该使用:
#include "cblas.h"
Run Code Online (Sandbox Code Playgroud)
您应该使用前缀为的Fortran名称(小写)调用函数cblas_:
cblas_dgemm(...);
Run Code Online (Sandbox Code Playgroud)
要使用的正确链接行是上面列出的第一个选项:
gcc -Wall -o outputprog main.c -lgoto2
Run Code Online (Sandbox Code Playgroud)
在紧要关头,您可以定义宏来将常规(未加前缀的)名称映射到正确的C函数名称,但我不相信它是值得的:
#define DGEMM cblas_dgemm
Run Code Online (Sandbox Code Playgroud)
或者(更安全,因为它检查参数列表的长度,但更详细):
#define DGEMM(a,b,c,d,e,f,g,h,i,j,k,l,m,n) cblas_dgemm(a,b,c,d,e,f,g,h,i,j,k,l,m,n)
Run Code Online (Sandbox Code Playgroud)
然后你可以写:
DGEMM(a, ..., n);
Run Code Online (Sandbox Code Playgroud)
并调用正确的函数.
上面提到的部分成功构建GotoBLAS2的实验表明:
cblas.h 不是独立的(与良好的编码标准相反).common.h 必须包括在它之前.common.h 包括很多其他标题:
以下代码有可能链接到完整的库:
#include "common.h"
#include "cblas.h"
void check_dgemm(void)
{
double A[33] = { 0.0 };
double B[33] = { 0.0 };
double C[33] = { 0.0 };
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
3, 3, 3, 2.0, A, 3, B, 3, 3.0, C, 3);
}
int main(void)
{
check_dgemm();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(在我无可否认的图书馆建设中,投诉从' cblas_dgemm()未找到'转移到其他一些缺失的功能.这是一个巨大的改进!)
| 归档时间: |
|
| 查看次数: |
3338 次 |
| 最近记录: |