MKL学习——数学运算库安装调试
前言
最近要用C++折騰一些東西,涉及到矩陣運(yùn)算,看了一下網(wǎng)上推薦的數(shù)學(xué)庫(kù),貌似MKL還是蠻不錯(cuò)滴,放到VS2013里面試試
國(guó)際慣例,來(lái)波地址
blas, cblas, openblas, atlas, lapack, mkl性能對(duì)比
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開(kāi)發(fā)文檔
安裝
下載
MKL安裝文件云盤共享:鏈接:http://pan.baidu.com/s/1qYRRIKs 密碼:x9db
安裝的時(shí)候還是得去官網(wǎng)申請(qǐng)序列號(hào)的,不然只能試用了。我的序列號(hào)刮開(kāi)可見(jiàn):
| 33RM-RDRJWB75 |
然后就是一直不斷下一步就行了,安裝完畢,會(huì)有這個(gè)目錄C:\Program Files (x86)\IntelSWTools
我這個(gè)目錄可能有點(diǎn)多,主要是因?yàn)樵诤笃趗pdate了一下,可以發(fā)現(xiàn)有compilers_and_libraries_2017.0.109和compilers_and_libraries_2017.2.187,但是前綴都是一樣的compilers_and_libraries_2017后面應(yīng)該是新版的發(fā)布日期
安裝
安裝的話,主要按照官網(wǎng)的教程來(lái),分為 Automatically和Manually兩種方法,這里就嘗試自動(dòng)第一種自動(dòng)方法吧,就兩步搞定。
- 隨便新建一個(gè)C++工程文件和源文件
- 然后右鍵test1->屬性->Intel Performance Librarys->use Intel MKL,選擇Parallel
- 在C/C++->代碼生成->運(yùn)行庫(kù),直接選擇多線程(/MT)即可,也就是選擇了lib靜態(tài)鏈接庫(kù)文件,如果是動(dòng)態(tài)鏈接庫(kù)文件,還得添加挺多l(xiāng)ib文件的,以后遇到再補(bǔ)充。詳細(xì)可以看看動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別
測(cè)試
直接使用官網(wǎng)提供的代碼Multiplying Matrices Using dgemm
實(shí)例做的運(yùn)算是矩陣乘法
調(diào)用函數(shù)是 cblas_dgemm,查官方文檔第111頁(yè),得到參數(shù)列表 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);
各參數(shù)的意思也在112頁(yè)有詳細(xì)說(shuō)明,這里簡(jiǎn)單說(shuō)說(shuō)
Layout:二維矩陣是以行為主,還是列為主 transa:指定對(duì)第一個(gè)輸入矩陣的操作,也就是在與第二個(gè)矩陣相乘之前的變換,提供了三種參數(shù),CblasNoTrans代表原封不動(dòng)輸入,CblasNoTrans代表轉(zhuǎn)置再輸入,CblasConjTrans代表共軛轉(zhuǎn)置輸入 transb:同transa,對(duì)矩陣的預(yù)處理操作 m:矩陣A和C的行數(shù) n:矩陣B和C的列數(shù),因?yàn)槭蔷仃囅喑寺?#xff0c;自己想想m*k與k*n的相乘結(jié)果 k:矩陣A的列數(shù),矩陣B的行數(shù) alpha:縮放因子 a、lda、b、ldb:針對(duì)前兩個(gè)參數(shù)的輸入均有不同的四種情況,具體看文檔 c:針對(duì)行優(yōu)先還是列優(yōu)先有不同的輸出 ldc:指定c矩陣是行優(yōu)先還是列優(yōu)先具體使用方法,主要還是C++的基本步驟:聲明變量,注意矩陣使用指針類型定義;然后用mkl_malloc開(kāi)辟空間,接下來(lái)for循環(huán)初始化矩陣;調(diào)用cblas_dgemm運(yùn)算;輸出,并利用mkl_free釋放內(nèi)存。
/* 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; }最好在運(yùn)行時(shí)候,看看#include"mkl.h"是否有智能提示,或者會(huì)不會(huì)有紅線說(shuō)找不到庫(kù)文件等錯(cuò)誤
運(yùn)行結(jié)果
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.請(qǐng)按任意鍵繼續(xù). . .后續(xù)
下一篇將看看MKL具有的矩陣運(yùn)算功能
總結(jié)
以上是生活随笔為你收集整理的MKL学习——数学运算库安装调试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Confluence Wiki Mark
- 下一篇: MKL学习——功能简介