- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想测试 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
}
下面是MKL
中测试cblas_*
的main.cpp
:
#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
关于c++ - 如何链接英特尔 MKL 库,仅使用 cblas_dgemm 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19117880/
dgesvd 似乎是一个具有 LAPACK_COL_MAJOR 布局的 LAPACKE_dgesvd,但查看 dgesvd 的示例和 LAPACKE_dgesvd dgesvd 示例中似乎有一个额外的
我尝试使用 g++ 用 intel mkl 11.1 进行编译: g++ -m32 test.c -lmkl_intel -lmkl_intel_thread -lmkl_core -liomp5 -
我有一个 cython 优化的速度程序,但速度仍然很慢。我想知道我的 cython 程序是否使用 OpenBLAS 还是 MKL(链接 openblas/mkl 库)?如何知道这一点? 最佳答案 这与
我正在尝试将 MKL 与 IPOPT 关联起来以提高性能。我已经通读了以下线程,它帮助我解决了很多问题。 Linking Ipopt with Intel MKL 但是,当我使用以下命令配置 Ipop
我正在努力尝试在 Windows 10 上生成 python 可执行文件。我已经尝试过 Cannot load mkl_intel_thread.dll on python executable 中提
我一直在尝试在 Windows 上使用 BLAS 获得一个快速运行的 numpy,到目前为止,唯一可行的方法是从 http://www.lfd.uci.edu/~gohlke/pythonlibs/#
我尝试设置一个文件来使用 PyCharm 编写 AI。 我正在使用的教程:https://www.youtube.com/watch?v=ujTCoH21GlA 当我运行代码时: $ import t
我有以下 Fortran 代码(在堆栈溢出的许多答案之上进行了修改......) Program blas integer, parameter :: dp = selected_real_k
操作系统:windows 10 64位 编译器:vc2015 64bits update 3 MXnet:1.3.1 构建mxnet 1.3.1(mxnet1.4.0有bug,windows下无法构建
我有一个非常大的矩形和方形 float 以及复杂的矩阵。我想知道是否有适当的 MKL 转置例程? MKL中有mkl_?imatcopy,请帮我举个例子。 我已经尝试过这个,但它没有转置矩阵 s
我正在运行 mkl_lab_solution.c这是使用 MKL 的示例,我可以正确编译它,但在运行时出现段错误。我的运行时如下: 操作系统是centos 6.3 gcc的版本是4.1.2 mkl 是
我有 win10、x64、i7-3770K 我从下载了 numpy-1.11.0+mkl-cp35-cp35m-win_amd64.whl http://www.lfd.uci.edu/~gohlke
MKL 的串行和并行版本在两个不同的库中实现。这些库的函数具有相同的名称。所以你不能直接加载两个库并分别调用每个函数,而不会在编译时发生冲突。 我想开发一个函数的包装器(例如 OpenGL Exten
我在一台新机器上工作,但找不到 MKL 库的路径。有没有办法知道它们是否安装以及安装在哪里?我尝试了 find -name,但我什么也没找到。也许它们根本没有安装。但是如何确定呢? 最佳答案 尝试使用
我正在尝试使用英特尔 MKL 库中的cblas_idamax函数来获取输入矩阵每列的最大值。在某些执行中我得到了正确的答案,但在其他执行中我得到了错误的索引。这是我的 C 代码示例: const MK
我正在尝试开发一个将矩阵 A 和 B 相乘的函数,它们是通用格式但本质上是稀疏的。这些矩阵包含复数。我的问题是,当我不使用该函数并将所有内容写入 main() 中时,乘法对于任何大小的数组都完美有效。
我尝试使用英特尔 MKL 提供的 cblas 将两个矩阵(例如 A 和 B)的乘积转换为 C。有什么原因会导致错误吗? double * A, *B, *C; A = (double *) callo
我必须使用 MKL 来求解线性方程组。该方程组用于求解二维泊松问题,因此正好有 5 条对角线不同于 0。方程组 Ax=b 的矩阵 A 是方阵,大小为 n*n。我检查了英特尔的文档,对调用顺序有点困惑。
我无法让英特尔 MKL 在 C 中正常工作。我有以下测试程序: #include "stdafx.h" #include"mkl.h" int main() { int one = 1;
有没有办法在 MKL 中计算矩阵的矩阵指数?我查看了引用手册,但只能找到用于查找 vector 元素指数的 v?Exp()。 (我基本上是在寻找 MATLAB expm() 等价物) 最佳答案 可以使
我是一名优秀的程序员,十分优秀!