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

来源:互联网 发布:英语听力软件高中下载 编辑:程序博客网 时间:2024/06/07 23:20
写这篇文章的目的主要是为了过一段时间忘记了的时候 可以回顾一下 省得忘的死死的.. 
希望有用到它的朋友 可以共同讨论.. 
首先接受一下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;

}


速度上可以看出 运算速度不是一个数量级.. 


感谢上面几个链接中的大大们 已经研究出这么好的东西 为我们所用 

大概总结干货就这 .. To be continue..