离线安装支持Intel MKL的R-3.6
R是一个常用于统计学问题和画图的免费软件(https://www.r-project.org/)。在线安装十分简单,本文主要介绍离线安装,且让R使用Intel编译器编译、调用Intel MKL库,以期提高计算速度。笔者测试安装和使用R时,所用Linux系统为CentOS 7,R版本为R-3.6.1,Intel编译器(含MKL)2018和2019都用过(分别在两台机器上)。
1. 下载R及其常用包
可以在官网(https://cloud.r-project.org/)或其镜像下载R的压缩包,笔者下载的是最新版R-3.6.1.tar.gz。R默认内含了一些包(或库),比如MASS包,可以通过命令行R,然后输入library(MASS)查看是否已安装;官网上还有许多他人写好的包可供使用,较为方便。点左侧Packages可显示出按字母排序的所有包,笔者下载了其中(根据自己所需挑选下载)
MatrixModels_0.4-1.tar.gz
Rcpp_1.0.2.tar.gz
RcppArmadillo_0.9.700.2.0.tar.gz
gtools_3.8.1.tar.gz
SparseM_1.77.tar.gz
quantreg_5.51.tar.gz
在成功安装R后我们再将其一个个安装进R目录。
2. 安装
R的安装需要一些系统库及其头文件(如libicudata.so, liblzma.so, zlib.h, bzlib.h等),为避免系统上缺失某些库/头文件,亦或去手动一个个检查、安装,笔者采取一劳永逸的办法:安装Anaconda Python“全家桶”(笔者用的是Anaconda3,装在/opt/anaconda3目录下),装完之后安装R所需的库和头文件在anaconda/include和anaconda/lib目录下都有。在~/.bashrc里写上环境变量
export PATH=/opt/anaconda3/bin:$PATH
export CPATH=/opt/anaconda3/include:$CPATH
export LD_LIBRARY_PATH=/opt/anaconda3/lib:$LD_LIBRARY_PATH
如果以前装过Anaconda,但是没写上面这三行全环境变量,只需将缺的补上即可。接着还要写一个系统库路径,
export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH
这样所需的库和头文件路径就都有了,执行source ~/.bashrc(或退出、重登陆)。然后依次执行以下四步即可
MKL="-L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl "
./configure -prefix=`pwd` --with-blas="$MKL" --with-lapack
--with-readline=no --with-x=no
CFLAGS="-I/opt/anaconda3/include/" LDFLAGS="-L/opt/anaconda3/lib"
F77=ifort FC=ifort CC=icc CXX=icpc
make
make install
第一步是指定Intel MKL的库路径。第二步`pwd`(`是键盘横排数字1左边的按键)表示安装于当前目录,可自行修改。--with-lapack后不用加参数,它也会使用--with-blas的"$MKL",--with-readline=no --with-x=no这两个是为了避免其使用系统上的readline和X11库及头文件。安装GNU readline库倒不难,但X11可能会依赖于其他库,笔者安装时就碰到了库依赖,反复折腾很是麻烦,于是直接写了no。CFLAGS和LDFLAGS分别指定编译所需头文件路径和库路径。最后四个参数指定使用Intel编译器。
完成后在~/.bashrc里写上R的环境变量
export PATH=/home/$USER/software/R-3.6.1/bin:$PATH
通过which R可以检查R所在的路径。最后安装R的常用包,这十分简单,格式都是R CMD INSTALL xxx.tar.gz:
R CMD INSTALL MatrixModels_0.4-1.tar.gz
R CMD INSTALL Rcpp_1.0.2.tar.gz
R CMD INSTALL RcppArmadillo_0.9.700.2.0.tar.gz
R CMD INSTALL gtools_3.8.1.tar.gz
R CMD INSTALL SparseM_1.77.tar.gz
R CMD INSTALL quantreg_5.51.tar.gz
不过要注意,上面这些包之间也可能有依赖关系。安装时若缺包会有提示应该先装哪个包。笔者展示的安装顺序是经过测试、不会有前后依赖问题的。
3. 可能的报错
(1)如果不利用anaconda3的头文件和库,可能会出现如下报错
checking whether zlib support suffices... configure: error: zlib library and headers are required
和/或
checking whether bzip2 support suffices... configure: error: bzip2 library and headers are required
和/或
configure: error: "liblzma library and headers are required"
分别表示系统缺zlib.h头文件,bzlib.h头文件和lzma.h头文件及其对应的库。解决方法:例如对于zlib.h,可去官网或其他镜像
https://www.zlib.net/zlib-1.2.11.tar.gz
下载。安装过程是标准的./configure, make, make install三部曲。若在configure步骤不指定--prefix安装目录,则默认安装至/usr/local/include/(头文件目录)和/usr/local/lib/(库文件目录)下。有root权限建议用root安装;若用普通用户安装,记得在~/.bashrc里写上环境变量(包括头文件和库文件)。如若解决了zlib的问题还报bzip2的错,说明系统缺bzlib.h头文件。可依次操作、安装所需库,略为繁琐。
(2)如果不指定--with-readline=no,有的机器可能出现如下报错
checking for rl_callback_read_char in -lreadline... no
configure: error: --with-readline=yes (default) and headers/libs are not available
说明当前系统缺readline库和相应头文件,可去官网
ftp://ftp.gnu.org/gnu/readline/readline-8.0.tar.gz
或其他镜像下载。安装过程和默认安装目录同(1)中所述。
(3)若不指定--with-x=no,有的机器可能会出现如下报错
configure: error: --with-x=yes (default) and X11 headers/libs are not available
说明系统缺X11库的部分头文件,可去官网
https://www.x.org/releases/X11R7.7/src/everything/libX11-1.5.0.tar.gz
或其他镜像下载。这个库安装过程中可能还会依赖于其他库、导致其他报错,比较繁琐,笔者就没有进一步尝试了。
Reference
https://software.intel.com/en-us/articles/using-intel-mkl-with-r
- 51. Socket服务端和客户端使用TCP协议通讯 | 厚土Go学习笔记
- 备库报警邮件的分析案例(二) (r7笔记第15天)
- Gotorch - 多机定时任务管理系统
- 备库报警邮件的分析案例(三)(r7笔记第16天)
- 简单易学的机器学习算法——神经网络之BP神经网络
- 24(02)多线程锁,线程通讯,线程组,线程池,多线程三种方式,匿名内部类,定时器,设计模式,单例模式,Runtime
- Go代码打通HTTPs
- 一个简单的MySQL参数导致的连接问题解惑(r7笔记第33天)
- [基础篇]Go语言变量
- [转载]Golang 编译成 DLL 文件
- [转载]Go JSON 技巧
- 简单易学的机器学习算法——Rosenblatt感知机的对偶解法
- Spring-拾遗
- Golang面试题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何取消rxjs Observable的订阅
- 使用Angular rxjs打印鼠标点击事件的x坐标之和
- js变量提升 和函数提升
- JavaWeb——HTTP请求协议及request对象使用方法一点通与request登录实战案例(含BeanUtils类的使用)
- redis学习(二十一)
- Linux下查看文件和文件夹大小
- 使用Angular rxjs进行优雅限流
- Nginx自动重定向
- dotnet OpenXML SDK 形状的翻转与旋转
- C# dotnet 使用 AsyncEx 库的 AsyncLock 异步锁
- bt5.9手动开心
- 项目中多个文件引入同一份公共样式less文件导致编译打包后有多份样式
- Angular rxjs Observable的异步行为
- Angular rxjs里自定义operator的使用
- tensorflow 生成指定大小的赋值0的张量 np.zeros 在TF中对应的语句 生成全0张量