如何链接Intel MKL库,只需使用cblas_dgemm函数

2024-04-22

我想测试Intel MKL矩阵乘法,所以我包括并且只使用 cblas_dgemm 函数,但它总是说

    undefined reference to `cblas_dgemm'

我还链接了-lmkl_core -lmkl_blas95_lp64 -lmkl_lapack95_lp64,但是我测试了库中的许多组合$MKLROOT/lib/intel64/目录下,错误依然存在。有人可以给我一些建议吗?谢谢。


也许这是一个正确的答案,我们可以使用cblas_:

在QT Creator的项目文件中:

    unix {
        INCLUDEPATH += /opt/intel/mkl/include
        LIBS += -L/opt/intel/mkl/lib/intel64 \
        -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core \
        -L/opt/intel/lib/intel64 \
        -liomp5 -lpthread -dl -lm
    }

以下是main.cpp用于测试cblas_* in MKL:

    #include <iostream>
    using namespace std;
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <mkl.h>
    #include <mkl_cblas.h>
    #include <mkl_blas.h>
    #include <mkl_lapack.h>
    #include <mkl_lapacke.h>

    template<typename T>
    void printArray(T *data, char *name, int len){
        cout << name << "\n";
        for(int i=0;i<len;i++){
            cout << data[i] << " ";
        }
        cout << "\n";
    }

    template<typename T>
    void printMatrix(T *data, char *name, int m, int n){
        cout << name << "\n";
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                cout << data[n*i+j] << " ";
            }
            cout << "\n";
        }
        cout << "\n";
    }

    int main()
    {
        int len=10;
        double *x=new double[len];
        double *y=new double[len];
        for(int i=0;i<len;i++){
            x[i]=(double)rand()/RAND_MAX;
            y[i]=(double)rand()/RAND_MAX;
        }
        printArray<double>(x, "x", len);
        printArray<double>(y, "y", len);

        //sum(x)
        double x_sum=cblas_dasum(len,x,1);
        cout<< "sum(x): "<< x_sum <<"\n";

        //y=a*x+y
        double alpha=1;
        cblas_daxpy(len,alpha,x,1,y,1);
        printArray<double>(y,"y=a*x+y",len);

        //y=x
        cblas_dcopy(len,x,1,y,1);
        printArray<double>(y,"y=x",len);

        //x*y';
        double xy_dot=cblas_ddot(len,x,1,y,1);
        cout <<"x*y': "<<xy_dot<<"\n";

        //extened x*y', not test
        //cblas_sdsdot(),not test
        //cbals_dsddot(),not test
        //for complex vector
        //cblas_dotc(),no this function
        //cblas_dotu(),no this function

        //norm(x), or ||x||_2
        double x_norm=cblas_dnrm2(len,x,1);
        cout<<"x_norm: "<<x_norm<<"\n";

        //x(i)=c*x(i)+s*y(i);
        //y(i)=c*y(i)-s*x(i);
        //cblas_zrotg(); not test

        //swap(x,y)
        cblas_dswap(len,x,1,y,1);
        printArray<double>(x,"x:",len);
        printArray<double>(y,"y:",len);


        //LEVEL 2 BLAS
        //matrix and vector manipulation
        int m=len;
        int n=len;
        double *A=new double[m*n];
        for(int i=0;i<m*n;i++){
            A[i]=(double)rand()/RAND_MAX;
        }
        printMatrix<double>(A,"A",m,n);

        //matrix and vector multiplication
        double alpha_dgemv=1.0;
        double beta_dgemv=1.0;
        //y=alpha*A*x+beta*y, if A is a mxn band matrix, then use cblas_dgbmv
        cblas_dgemv(CblasRowMajor,CblasNoTrans,m,n,alpha_dgemv,A,m,x,1,beta_dgemv,y,1);
        printArray<double>(x,"x:",len);
        printArray<double>(y,"y=alpha*A*x+beta*y",len);
        //y=alpha*A'*x+beta*y
        cblas_dgemv(CblasRowMajor,CblasTrans,m,n,alpha_dgemv,A,m,x,1,beta_dgemv,y,1);
        printArray<double>(x,"x:",len);
        printArray<double>(y,"y=alpha*A'*x+beta*y",len);

        //A=alpha*x*y'+A;
        double alpha_dger=1.0;
        cblas_dger(CblasRowMajor,m,n,alpha_dger,x,1,y,1,A,m);
        printArray<double>(x,"x:",len);
        printArray<double>(y,"y:",len);
        printMatrix<double>(A,"A=alpha1*x*y'+A",m,n);
        delete[] x;x=NULL;
        delete[] y;y=NULL;
        delete[] A;A=NULL;


        //
        m=10;
        n=5;
        int k=3;
        double *Amxk=new double[m*k];
        double *Bkxn=new double[k*n];
        double *Cmxn=new double[m*n];
        for(int i=0;i<m*k;i++){
            Amxk[i]=(double)rand()/RAND_MAX;
        }
        for(int i=0;i<k*n;i++){
            Bkxn[i]=(double)rand()/RAND_MAX;
        }
        for(int i=0;i<m*n;i++){
            Cmxn[i]=0;
        }
        printMatrix<double>(Amxk,"Amxk",m,k);
        printMatrix<double>(Bkxn,"Bkxn",k,n);
        printMatrix<double>(Cmxn,"Cmxn",m,n);
        double alpha_dgemm=1.0;
        double beta_dgemm=1.0;
        cblas_dgemm(CblasRowMajor,
                    CblasNoTrans,
                    CblasNoTrans,
                    m,
                    n,
                    k,
                    alpha_dgemm,
                    Amxk,
                    k,
                    Bkxn,
                    n,
                    beta_dgemm,
                    Cmxn,
                    n);
        printMatrix<double>(Cmxn,"Cmxn",m,n);
        delete[] Amxk;
        delete[] Bkxn;
        delete[] Cmxn;


        //general symmetric matrix eigenvalue decomposition
        /* Locals */
        const MKL_INT N=5;
        const MKL_INT LDA=5;
        MKL_INT  lda = LDA, info;
        n=N;
        /* Local arrays */
        double w[N];
        double a[LDA*N] = {
            6.39,  0.13, -8.23, 5.71, -3.18,
            0.00,  8.37, -4.46, -6.10,  7.21,
            0.00,  0.00, -9.58, -9.25, -7.42,
            0.00,  0.00, 0.00, 3.72,  8.54,
            0.00,  0.00, 0.00, 0.00,  2.51
        };
        /* Executable statements */
        printf( "LAPACKE_dsyevd (row-major, high-level) Example Program Results\n" );
        /* Solve eigenproblem */
        info = LAPACKE_dsyevd( LAPACK_ROW_MAJOR, 'V', 'U', n, a, lda, w );
        /* Check for convergence */
        if( info > 0 ) {
            printf( "The algorithm failed to compute eigenvalues.\n" );
            exit( 1 );
        }
        printArray<double>(w,"w:",N);
        printMatrix<double>(a,"a:",N,N);


        int N1=10;
        int d=3;
        double *A1=new double[N1*d];
        for(int j=0;j<d;j++){
        for(int i=0;i<N1;i++){

                A1[j*N1+i]=(double)rand()/RAND_MAX;
            }
        }
        printMatrix<double>(A1,"A:",d,N1);

        double *A_mean=new double[1*d];
        for(int i=0;i<d;i++){
            A_mean[i]=cblas_dasum(N,A1+i*N1,1);
        }
        printArray<double>(A_mean,"A_mean",d);
        delete[] A1;A1=NULL;
        delete[] A_mean;A_mean=NULL;
        return 0;
    }

然后,在终端中键入以下代码以加载环境设置:

    source /opt/intel/bin/compilervars.sh intel64
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何链接Intel MKL库,只需使用cblas_dgemm函数 的相关文章

  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig

随机推荐