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) 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…

相机矩阵(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】基于Python多标签方法——VOC2012数据集

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

【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中张量部分函数

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

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

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

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求&#xff0c;这么神奇的网络是时候分析一波了&#xff0c;我个人的学习方法调试代码&#xff0c;然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…

【theano-windows】学习笔记十二——卷积神经网络

前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上&#xff1f; 卷积小知识 三大特性&#xff1a;局部感知(稀疏连接), 权值共享, 池化 上图很重要, 描述的是前一个隐层m-1具有四…

【theano-windows】学习笔记十三——去噪自编码器

前言 上一章节学习了卷积的写法,主要注意的是其实现在theano.tensor.nnet和theano.sandbox.cuda.dnn中都有对应函数实现, 这一节就进入到无监督或者称为半监督的网络构建中. 首先是自编码器(Autoencoders)和降噪自编码器(denoising Autoencoders) 国际惯例, 参考网址: Denoi…

【theano-windows】学习笔记十四——堆叠去噪自编码器

前言 前面已经学习了softmax,多层感知器,CNN&#xff0c;AE&#xff0c;dAE&#xff0c;接下来可以仿照多层感知器的方法去堆叠自编码器 国际惯例&#xff0c;参考文献&#xff1a; Stacked Denoising Autoencoders (SdA) Greedy Layer-Wise Training of Deep Networks 理…

【theano-windows】学习笔记十五——受限玻尔兹曼机

前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考博客,超级强推第二个博客, 证明过程很给力: Restricted Boltzmann Machines (R…

【Ogre-windows】环境配置

前言 由于工程原因, 学习一下Ogre面向对象图形渲染开源引擎, 慢慢爬坑吧。首先还是环境的配置问题哎. 其实最重要的是要预先编译三方库, 虽然官方说可以自动编译, 但是在自己电脑上还是出现了无法解析外部符号之类的问题, 正常情况下我就认为是三方库的lib出现了问题, 最后额外…

【theano-windows】学习笔记十六——深度信念网络DBN

前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(deep Boltzmann machine), 这里就先学习一下DBN. 国际惯例, 参考博文: Deep Belief Networks A fast lear…