VS2015+Intel MKL+Eigen的安裝與混合編程

??Intel MKL是一個非常高性能的矩陣庫,Matlab的矩陣計算核心就是鏈接了這個庫。但可惜國內(nèi)學(xué)習(xí)資源不多,而且語法跟Matlab、Numpy等相差甚遠,因此比較少用。但是我們可以用MKL來加速語法風(fēng)格跟Matlab、Numpy很像的Eigen庫,使得用了Eigen庫的C++矩陣計算程序在一定程度上趕超Matlab的矩陣運算性能。//使用Eigen編碼,Intel MKL優(yōu)化

Eigen庫是一個高層次的C++矩陣庫,支持包括固定大小、任意大小的所有矩陣操作,甚至是稀疏矩陣;支持所有標準的數(shù)值類型,并且可以擴展為自定義的數(shù)值類型;支持多種矩陣分解及其幾何特征的求解;它不支持的模塊生態(tài)系統(tǒng)提供了許多專門的功能,如非線性優(yōu)化,矩陣功能,多項式解算器,快速傅立葉變換等。

? 多的不說了,下面開始進行Intel MKL的安裝:

一.Intel MKL安裝及VS2015下的屬性配置:(謹記:要先安裝VS再安裝MKL?。?/p>

我安裝的是2018版本。于是我下載parallel_studio_xe_2018。推薦從官網(wǎng)下載,安裝文件在3.4G左右。

在官網(wǎng)用郵箱注冊可以獲得試用的下載碼以及l(fā)ic激活文件(我們可以認為它是免費的了)。

打開該文件,居然是要解壓才能繼續(xù)安裝……

點擊setup.exe進行安裝……

? 我選擇的路徑是:D:\Program Files\IntelSWTools

? 選擇Integration Target為VS2015:

? 然后根據(jù)步驟安裝即可。

? 安裝后是這個樣子的:此時環(huán)境變量已經(jīng)自動設(shè)置好,就差VS2015里面的相關(guān)配置了。

? 下面開始配置VS2015使其能夠調(diào)用Intel MKL庫:

新建一個C++控制臺項目,打開該項目的“屬性管理器”:

這里Debug和Release的屬性配置方法都是一樣的,不同的是32位和64位的配置。

在Release|Win32下新建一個MKL屬性:

雙擊剛剛新建的屬性配置文件,依次配置:VC++目錄->可執(zhí)行目錄;VC++目錄->包含目錄;VC++目錄->庫目錄;鏈接器->附加依賴項。具體的配置內(nèi)容如圖所示:

這樣就OK了。下面配置Release|x64的屬性:

同理創(chuàng)建好屬性配置文件:

? ?雙擊剛剛新建的屬性配置文件,依次配置:VC++目錄->可執(zhí)行目錄;VC++目錄->包含目錄;VC++目錄->庫目錄;鏈接器->附加依賴項。注意:其中的“VC++目錄->可執(zhí)行目錄;VC++目錄->包含目錄”兩項配置內(nèi)容跟前面的win32配置是一樣的。后面的兩項“VC++目錄->庫目錄;鏈接器->附加依賴項”配置就有點不同了!這兩項的詳細配置內(nèi)容如下圖:

OK,完成上述步驟之后就可以在VS2015的該項目上調(diào)用Intel MKL庫了。

實例代碼不急著看……等講完Eigen的安裝與配置再放測試代碼。

二. Eigen3的安裝及VS2015中的屬性配置:

? ?1. 安裝Eigen3相對簡單很多,只需在官網(wǎng)上下載一個壓縮包,然后解壓到某個文件夾上即可:具體如下:

(當(dāng)然也可以在github中下載到)

2. 解壓到喜歡的文件夾下:

3. VS2015中的屬性配置:此時無論是Debug模式還是Release模式,無論是Win32還是x64,都是一樣的配置方法(因此只需建立一個配置文件,然后在屬性管理器的其他模式下添加該配置文件即可)。

????????一步到位:C/C++->常規(guī)->附加包含目錄

????????下面就可以來測試Eigen與Intel MKL結(jié)合的運行效果了:

代碼如下:

//使用Eigen編碼,Intel MKL優(yōu)化//加這兩行,用于調(diào)用Intel MKL庫進行優(yōu)化

#define EIGEN_USE_MKL_ALL

#define EIGEN_VECTORIZE_SSE4_2

#include?? <iostream>

#include?? <windows.h>

#include?? <stdlib.h>

#include?? <Eigen/Core>

#include?? <Eigen/Dense>

#include?? <time.h>

using namespace std;

using namespace Eigen;

int main(int argc, char *argv[])

{

mkl_set_dynamic(4); // Intel MKL庫里面的一個函數(shù),用來指定使用4個CPU進行計算

double start = clock();

MatrixXd a = MatrixXd::Random(300, 300);? // 隨機初始化矩陣

MatrixXd b = MatrixXd::Random(300, 300);

// 循環(huán)5000次以測試性能與Matlab對比

for (int i = 0; i < 5000; i++) {

MatrixXd c = a * b;? ? // 矩陣相乘

c = a.inverse(); // 求逆矩陣

c = a + b;? // 矩陣相加

c = a.cwiseProduct(b); // 矩陣a和b按元素相乘(對應(yīng)于Matlab的 .* )

}

double endd = clock();

double thisTime = (double)(endd - start) / CLOCKS_PER_SEC; // 輸出運行時間

cout << thisTime << "秒" << endl;

return 0;

}

運行效果:

為了對比,用Matlab寫一個相同功能的進行效率對比:

看到這個結(jié)果不要對C++的Eigen結(jié)合Intel MKL的方法感到失望。雖然Eigen本身也是個高性能的矩陣庫,但也不如Intel MKL針對英特爾的CPU的特殊優(yōu)化。本例中,因為畢竟是結(jié)合Intel MKL優(yōu)化,而不是純粹地用MKL。而Matlab是高度優(yōu)化地用了Intel MKL進行矩陣計算的。因此這個C++的Eigen結(jié)合Intel MKL在矩陣計算上只能匹的得上Matlab,但是至于趕超,還需要純粹地用Intel MKL或者再進行深度優(yōu)化。

但是,C++在循環(huán)上效率是遠超Matlab的,因此,假如上面的程序執(zhí)行10000次,那么效率如下:

????? ? 可見當(dāng)大量進行循環(huán)時,用C++的Eigen結(jié)合Intel MKL方法,效率會比Matlab好,而且,開發(fā)效率也不比Matlab低。更不用說python了,python的numpy+mkl也難以跟上這個效率。關(guān)鍵是,Eigen是開源免費的,而Intel MKL我們可以用郵箱申請到非商業(yè)版,也等于是免費的了。相比要收費的Matlab而言,是越來越受到學(xué)生和開發(fā)者們的青睞了。

有人可能會認為搞矩陣搞機器學(xué)習(xí)人工智能,就應(yīng)該用matlab、就應(yīng)該用python,而不應(yīng)該用折騰人的C++。這點我不否定,但其實python可以輕松地與C++結(jié)合。tensorflow也是如此,它的內(nèi)核是用C++的,只是給python提供了接口以便用Python進行快速構(gòu)建。順便一提,tensorflow的矩陣庫也是用eigen的,因此可以用python進行快速開發(fā),同時也保證了極高的效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容