MKL学习——数学运算库安装调试

前言

最近要用C++折腾一些东西,涉及到矩阵运算,看了一下网上推荐的数学库,貌似MKL还是蛮不错滴,放到VS2013里面试试

国际惯例,来波地址

blas, cblas, openblas, atlas, lapack, mkl性能对比

Compiling and Linking Intel® Math Kernel Library with Microsoft* Visual C++*

Visual Studio 2013配置Intel MKL

Intel MKL 在VS中的配置与安装笔记

Getting Started with Intel® Math Kernel Library 2017 for Windows

Developer Reference for Intel® Math Kernel Library 2017 - C

Multiplying Matrices Using dgemm

官方mkl开发文档

安装

下载

MKL安装文件云盘共享:链接:http://pan.baidu.com/s/1qYRRIKs 密码:x9db

安装的时候还是得去官网申请序列号的,不然只能试用了。我的序列号刮开可见:

33RM-RDRJWB75

然后就是一直不断下一步就行了,安装完毕,会有这个目录C:\Program Files (x86)\IntelSWTools

这里写图片描述

我这个目录可能有点多,主要是因为在后期update了一下,可以发现有compilers_and_libraries_2017.0.109compilers_and_libraries_2017.2.187,但是前缀都是一样的compilers_and_libraries_2017后面应该是新版的发布日期

安装

安装的话,主要按照官网的教程来,分为 Automatically和Manually两种方法,这里就尝试自动第一种自动方法吧,就两步搞定。

  • 随便新建一个C++工程文件和源文件

这里写图片描述

  • 然后右键test1->属性->Intel Performance Librarys->use Intel MKL,选择Parallel

这里写图片描述

  • 在C/C++->代码生成->运行库,直接选择多线程(/MT)即可,也就是选择了lib静态链接库文件,如果是动态链接库文件,还得添加挺多lib文件的,以后遇到再补充。详细可以看看动态库和静态库的区别

这里写图片描述

测试

直接使用官网提供的代码Multiplying Matrices Using dgemm

实例做的运算是矩阵乘法

C:=αAB+βC

调用函数是 cblas_dgemm,查官方文档第111页,得到参数列表

void cblas_dgemm (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, const
CBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, const MKL_INT k, const double
alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const
double beta, double *c, const MKL_INT ldc);

各参数的意思也在112页有详细说明,这里简单说说

Layout:二维矩阵是以行为主,还是列为主
transa:指定对第一个输入矩阵的操作,也就是在与第二个矩阵相乘之前的变换,提供了三种参数,CblasNoTrans代表原封不动输入,CblasNoTrans代表转置再输入,CblasConjTrans代表共轭转置输入
transb:同transa,对矩阵的预处理操作
m:矩阵A和C的行数
n:矩阵B和C的列数,因为是矩阵相乘嘛,自己想想m*k与k*n的相乘结果
k:矩阵A的列数,矩阵B的行数
alpha:缩放因子
a、lda、b、ldb:针对前两个参数的输入均有不同的四种情况,具体看文档
c:针对行优先还是列优先有不同的输出
ldc:指定c矩阵是行优先还是列优先

具体使用方法,主要还是C++的基本步骤:声明变量,注意矩阵使用指针类型定义;然后用mkl_malloc开辟空间,接下来for循环初始化矩阵;调用cblas_dgemm运算;输出,并利用mkl_free释放内存。

/* C source code is found in dgemm_example.c */#define min(x,y) (((x) < (y)) ? (x) : (y))#include <stdio.h>
#include <stdlib.h>
#include "mkl.h"int main()
{double *A, *B, *C;int m, n, k, i, j;double alpha, beta;printf("\n This example computes real matrix C=alpha*A*B+beta*C using \n"" Intel(R) MKL function dgemm, where A, B, and  C are matrices and \n"" alpha and beta are double precision scalars\n\n");m = 2000, k = 200, n = 1000;printf(" Initializing data for matrix multiplication C=A*B for matrix \n"" A(%ix%i) and matrix B(%ix%i)\n\n", m, k, k, n);alpha = 1.0; beta = 0.0;printf(" Allocating memory for matrices aligned on 64-byte boundary for better \n"" performance \n\n");A = (double *)mkl_malloc(m*k*sizeof(double), 64);B = (double *)mkl_malloc(k*n*sizeof(double), 64);C = (double *)mkl_malloc(m*n*sizeof(double), 64);if (A == NULL || B == NULL || C == NULL) {printf("\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");mkl_free(A);mkl_free(B);mkl_free(C);return 1;}printf(" Intializing matrix data \n\n");for (i = 0; i < (m*k); i++) {A[i] = (double)(i + 1);}for (i = 0; i < (k*n); i++) {B[i] = (double)(-i - 1);}for (i = 0; i < (m*n); i++) {C[i] = 0.0;}printf(" Computing matrix product using Intel(R) MKL dgemm function via CBLAS interface \n\n");cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,m, n, k, alpha, A, k, B, n, beta, C, n);printf("\n Computations completed.\n\n");printf(" Top left corner of matrix A: \n");for (i = 0; i<min(m, 6); i++) {for (j = 0; j<min(k, 6); j++) {printf("%12.0f", A[j + i*k]);}printf("\n");}printf("\n Top left corner of matrix B: \n");for (i = 0; i<min(k, 6); i++) {for (j = 0; j<min(n, 6); j++) {printf("%12.0f", B[j + i*n]);}printf("\n");}printf("\n Top left corner of matrix C: \n");for (i = 0; i<min(m, 6); i++) {for (j = 0; j<min(n, 6); j++) {printf("%12.5G", C[j + i*n]);}printf("\n");}printf("\n Deallocating memory \n\n");mkl_free(A);mkl_free(B);mkl_free(C);printf(" Example completed. \n\n");return 0;
}

最好在运行时候,看看#include"mkl.h"是否有智能提示,或者会不会有红线说找不到库文件等错误

运行结果

 This example computes real matrix C=alpha*A*B+beta*C usingIntel(R) MKL function dgemm, where A, B, and  C are matrices andalpha and beta are double precision scalarsInitializing data for matrix multiplication C=A*B for matrixA(2000x200) and matrix B(200x1000)Allocating memory for matrices aligned on 64-byte boundary for betterperformanceIntializing matrix dataComputing matrix product using Intel(R) MKL dgemm function via CBLAS intComputations completed.Top left corner of matrix A:1           2           3           4           5           6201         202         203         204         205         206401         402         403         404         405         406601         602         603         604         605         606801         802         803         804         805         8061001        1002        1003        1004        1005        1006Top left corner of matrix B:-1          -2          -3          -4          -5          -6
       -1001       -1002       -1003       -1004       -1005       -1006
       -2001       -2002       -2003       -2004       -2005       -2006
       -3001       -3002       -3003       -3004       -3005       -3006
       -4001       -4002       -4003       -4004       -4005       -4006
       -5001       -5002       -5003       -5004       -5005       -5006
Top left corner of matrix C:
-2.6666E+009-2.6666E+009-2.6667E+009-2.6667E+009-2.6667E+009-2.6667E+009
-6.6467E+009-6.6467E+009-6.6468E+009-6.6468E+009-6.6469E+009 -6.647E+009
-1.0627E+010-1.0627E+010-1.0627E+010-1.0627E+010-1.0627E+010-1.0627E+010
-1.4607E+010-1.4607E+010-1.4607E+010-1.4607E+010-1.4607E+010-1.4607E+010
-1.8587E+010-1.8587E+010-1.8587E+010-1.8587E+010-1.8588E+010-1.8588E+010
-2.2567E+010-2.2567E+010-2.2567E+010-2.2567E+010-2.2568E+010-2.2568E+010
Deallocating memoryExample completed.请按任意键继续. . .

后续

下一篇将看看MKL具有的矩阵运算功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MKL学习——功能简介

基本术语 BLAS : Basic Linear Algebra Subprograms 基本线性代数子程序 BLACS : Basic Linear Algebra Communication Subprograms 基本线性代数通信子程序 LAPACK : Linear Algebra PACKage 线性代数包 ScaLAPACK : Scalable LAPACK PBLAS : Parallel Basic Linear Alg…

MKL学习——向量操作

前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一定规范&#xff0c;便于记忆 <character> <name> <mod> () character 定义的是数据类型 s实数域&#…

【caffe-Windows】识别率批量输出——matlab实现

前言 今天看到群里有人问”用matlab输出测试集的精度“&#xff0c;瞎试了一下&#xff0c;好像还成功了。主要还是依据前面所有在matlab中操作caffe的博客。 这里说一下&#xff1a;classification.m是适用单张图片的精度&#xff0c;类似于classification.exe的功能&#x…

MKL学习——矩阵向量操作

前言 前面介绍的BLAS Level 1是向量-向量的操作&#xff0c;而这里的BLAS Level 2主要还是对矩阵-向量之间的操作。命名规则与前面的一样&#xff0c;主要记住定义的是数据类型 s实数域&#xff0c;单精度c复数域&#xff0c;单精度d实数域&#xff0c;双精度z复数域&#xf…

MKL学习——矩阵矩阵操作

前言 前面介绍了BLAS Level 1中向量-向量操作&#xff0c;以及BLAS Level 2中矩阵-向量的操作&#xff0c;就剩下这一篇的BLAS Level 3中的矩阵-矩阵的操作了。对稀疏矩阵的操作以后等要用再看看。对基本的矩阵和向量运算的函数有所了解以后&#xff0c;就进行常用参数分析&am…

MKL学习——线性代数概念相关

前言 回顾一下BLAS Level 1 2 3中的运算都有什么类型 BLAS Level 1 在BLAS Level 1中&#xff0c;进行的是向量-向量的操作。其中相关概念有 向量类型: 实数域&#xff0c;复数域&#xff0c;共轭运算操作: 元素求和&#xff0c;向量相加&#xff0c;向量拷贝&#xff0c;点乘…

MKL学习——基本操作C++实现

前言 前面介绍了各种向量-向量&#xff0c;矩阵-向量&#xff0c;矩阵-矩阵的函数简介。根据自身目前状况&#xff0c;主要使用实数域的操作&#xff0c;也就是说关注单精度float类型的s和双精度double类型的d。还有就是用的基本都是全矩阵&#xff0c;没有经过压缩&#xff0…

相机矩阵(Camera Matrix)

前言 最近翻阅关于从2D视频或者图片中重构3D姿态的文章及其源码&#xff0c;发现都有关于摄像机参数的求解&#xff0c;查找了相关资料&#xff0c;做一下笔记。 国际惯例&#xff0c;来一波参考网址 透视变换、透镜畸变及校正模型、相机校正(Camera Calibration)、Matlab相…

损失函数梯度对比-均方差和交叉熵

前言 我们都知道在机器学习中&#xff0c;希望算法或者网络收敛更快&#xff0c;有些是对数据预处理&#xff0c;尤其是Batch Normalization&#xff0c;有些是采用不同的激活函数&#xff0c;尤其是Relu激活函数取得了巨大的成功&#xff0c;还有一种加速收敛方法是更换损失函…

如何选择深度学习优化器

前言 转载地址&#xff1a;如何选择深度学习优化器 作者&#xff1a;不会停的蜗牛 CSDN AI专栏作家 在很多机器学习和深度学习的应用中&#xff0c;我们发现用的最多的优化器是 Adam&#xff0c;为什么呢&#xff1f; 下面是 TensorFlow 中的优化器&#xff0c; https://w…

【caffe-Windows】以mnist为例的hdf5单标签处理——matlab实现

前言 主要是想尝试看一下多标签的caffe是如何进行输入输出的&#xff0c;但是目前还未找到基于原始caffe做多标签输入的代码&#xff0c;大部分都是基于源码做了一部分修改实现多标签分类&#xff0c;caffe官网倒是有一个多标签的Python程序&#xff0c;这个我慢慢研究研究&am…

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言 按照上一篇博客所遗留的话题&#xff1a;多标签分类&#xff0c;进行初步探索&#xff0c;此篇博客针对caffe官网的多分类进行配置&#xff0c;只不过是Python接口的&#xff0c;不过官网在开头说明可以使用HDF5或者LMDB进行操作&#xff0c;只不过Python更加方便罢了 国…

【theano-windows】学习笔记一——theano中的变量

前言 因为目前需要搭建一些关于RBM或者其他之类的模型&#xff0c;感觉不太会折腾caffe&#xff0c;然而我发现了几个有趣网址&#xff0c;使用theano实现了各种各样的模型&#xff0c;所以&#xff0c;尝试学一下theano。主要以官方教程为主&#xff0c;所以博客会以译文的方…

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型&#xff0c;也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数&#xff0c;类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言&#xff0c;包含梯度、偏置、参数更新&#xff0c;而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算&#xff0c;这一章节就是看看…

【theano-windows】学习笔记四——theano中的条件语句

前言 按照官网教程&#xff0c;学习条件语句Switch和ifelse的使用 参考地址: conditions 性能对比 ifElse是将布尔变量和两个变量当做输入 Switch是将张量和两个变量当做输入. 因为Switch是元素级操作&#xff0c;所以比ifElse更具一般性 Switch需要对所有输出变量进行评…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了&#xff0c;但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作&#xff0c;最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

多标签分类、多任务分类、多输出回归概念

前言 虽然不是搞分类的&#xff0c;但是还是看看多标签和多分类的区别。为了避免自己的错误理解, 当然是选择原谅他啊…….找正规文档看哇. 以下翻译分别来自scikit-learn.org和 维基 喂鸡百科 国际惯例&#xff0c;贴上来源: Multiclass and multilabel algorithms Multi-…

【theano-windows】学习笔记七——logistic回归

前言 前面只是学了最基本的theano操作&#xff0c;但是theano中还有很多其他的东西&#xff0c;比如图结构&#xff0c;自定义函数等&#xff0c;这些暂时没有用到就先不看了&#xff0c;后续学啥用啥&#xff0c;没必要一口气吃个胖子&#xff0c;免得消化不良还把前面吃的东…