天天看點

Nlopt庫Eigen庫以及MKL的使用心得

寫這篇文章的目的主要是為了過一段時間忘記了的時候 可以回顧一下 省得忘的死死的.. 

希望有用到它的朋友 可以共同讨論.. 

首先接受一下Nlopt這個庫:

它是一個可以實作二次規劃的C++庫.

這個庫配置非常簡單稍後會上傳庫的源碼

值得說明的是 這個庫本人下載下傳下來之後沒有.lib檔案 隻有.def檔案

(需要利用.def 生成.lib檔案 這個過程可以參考http://blog.csdn.net/yunfeiyang62/article/details/45949701 )

下載下傳完之後生成.lib之後 就可以做簡單的配置環境了(頭檔案、庫檔案的配置 非常簡單 要是不會的話 之後我會在具體說明, 目前暫時忽略) 

如果已經成功配置好Nlopt環境的話 如果使用它?

下面先提供幾個網頁

A. Nlopt庫參數介紹:http://manpages.ubuntu.com/manpages/wily/man3/nlopt.3.html

B. 簡單的使用介紹1:http://ab-initio.mit.edu/wiki/index.php/NLopt_Tutorial

C. 簡單的使用介紹2:https://zhuanlan.zhihu.com/p/24350637?columnSlug=econcode

上面的網頁中有執行個體代碼 非常簡單易懂 看完之後 應該對這個庫的基本使用 有了基礎的了解 

其次介紹Eigen庫:

它是一個可以實作矩陣計算的C++庫 

這個庫讓C語言中的矩陣計算 變成的 “1+1 = 2” 

下面提供幾個使用Eigen庫的方法: 

A. http://blog.csdn.net/xiamentingtao/article/details/54341475

B. http://www.cnblogs.com/goingupeveryday/p/5699053.html

這個庫本人是之前安裝PCL庫附帶安裝的 如果隻想安裝Eigen庫 可以參考上面的 "B." 網頁 

這個庫雖然很好用 但是速度方面耗時也是巨大的 (尤其對于高次元的) .. 

是以引出了 MKL 這個庫 

 MKL庫全稱 Intel® Math Kernel Library :

一個數學核心函數庫提供經過高度優化和大量線程化處理大大提高運算速度!

先提供下載下傳網址:

https://registrationcenter.intel.com/en/products/postregistration/?sn=33RM-ZLG7FNL9&EmailID=368280257%40qq.com&Sequence=2058373

https://software.intel.com/en-us/mkl

安裝完畢後環境配置一樣不難 如有不會的 可以@我 

之後在工程設定Property Pages->Inter Performance Library->Use intel MKL->Parallel 

并在程式代碼中添加

#define EIGEN_USE_MKL_ALL

#define EIGEN_VECTORIZE_SSE4_2

即可使用

下面測試下運作速度,代碼如下(登出掉上面2個宏就是無加速版):

#define SPEED 1

#ifndef SPEED

#define EIGEN_USE_MKL_ALL

#define EIGEN_VECTORIZE_SSE4_2

#else 

#endif 

#include <iostream>

#include <Eigen/Core>

#include <Eigen/Dense>

#include <time.h>

using namespace std;

using namespace Eigen;

// 使用Eigen+Intel MKL

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

{

MatrixXd a = MatrixXd::Random(3000, 3000);  // 随機初始化矩陣

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

double start = clock();

MatrixXd c = a * b;    // 乘法好簡潔

double endd = clock();

double thisTime = (double)(endd - start) / CLOCKS_PER_SEC;

#ifndef SPEED

cout << "加速後: " << thisTime << endl;

#else 

cout << "未加速: " << thisTime << endl;

#endif // 1

system("PAUSE");

return 0;

}

Nlopt庫Eigen庫以及MKL的使用心得

速度上可以看出 運算速度不是一個數量級.. 

感謝上面幾個連結中的大大們 已經研究出這麼好的東西 為我們所用 

大概總結幹貨就這 .. To be continue..