- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经构建了一个自定义包,其中包含一些用 RcppEigen 编写的函数。我还打开了 Microsoft R,并启用了 Intel MKL。如何将 R 包链接到英特尔 MKL 功能?
设置 1:
以下是我尝试在普通 R 中将包与 MKL 链接的过程,但失败了:
The Eigen documents说我需要:
1. #define EIGEN_USE_MKL_ALL
2. link your program to MKL libraries
基于2,在我的Makevars文件中
PKG_CXXFLAGS = -I/opt/intel/mkl/include
PKG_LIBS = ${LAPACK_LIBS} ${BLAS_LIBS} ${FLIBS} -L/opt/intel/mkl/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
编译包时出现错误:
Error in dyn.load(dllfile) :
unable to load shared object '/home/path/RPackageName.so':
libmkl_intel_lp64.so: cannot open shared object file: No such file or directory
根据Ralf的评论更新:在Makevars文件中添加选项<,-rpath,'path'>,错误消失了。
PKG_CXXFLAGS = -DMKL_LP64 -m64 -I/opt/intel/mkl/include
PKG_LIBS = ${LAPACK_LIBS} ${BLAS_LIBS} ${FLIBS} -L/opt/intel/mkl/lib/intel64 -Wl,--no-as-needed,-rpath,'/opt/intel/mkl/lib/intel64' -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
包编译成功,但下面有这些消息,我不明白。
/home/shen/R/x86_64-pc-linux-gnu-
library/3.4/RcppEigen/include/Eigen/src/Core/Assign_MKL.h: In
instantiation of ‘static void Eigen::internal::Assignment<DstXprType,
Eigen::CwiseUnaryOp<Eigen::internal::scalar_log_op<double>,
SrcXprNested>, Eigen::internal::assign_op<double, double>,
Eigen::internal::Dense2Dense, typename
Eigen::internal::enable_if<Eigen::internal::vml_assign_traits<Dst,
Src>::EnableVml>::type>::run(DstXprType&, const SrcXprType&, const
Eigen::internal::assign_op<double, double>&) [with DstXprType =
Eigen::Matrix<double, -1, 1>; SrcXprNested = const
Eigen::ArrayWrapper<const Eigen::Matrix<double, -1, -1> >;
Eigen::internal::Assignment<DstXprType,
Eigen::CwiseUnaryOp<Eigen::internal::scalar_log_op<double>,
SrcXprNested>, Eigen::internal::assign_op<double, double>,
Eigen::internal::Dense2Dense, typename
Eigen::internal::enable_if<Eigen::internal::vml_assign_traits<Dst,
Src>::EnableVml>::type>::SrcXprType =
Eigen::CwiseUnaryOp<Eigen::internal::scalar_log_op<double>, const
Eigen::ArrayWrapper<const Eigen::Matrix<double, -1, -1> > >]’:
/home/shen/R/x86_64-pc-linux-gnu-
library/3.4/RcppEigen/include/Eigen/src/Core/AssignEvaluator.h:836:49:
required from ‘void Eigen::internal::call_assignment_no_alias(Dst&,
const Src&, const Func&) [with Dst = Eigen::Matrix<double, -1, 1>; Src
= Eigen::CwiseUnaryOp<Eigen::internal::scalar_log_op<double>, const
Eigen::ArrayWrapper<const Eigen::Matrix<double, -1, -1> > >; Func =
Eigen::internal::assign_op<double, double>]’
设置 2我直接在MRO中编译,没有在Makevars文件中添加任何特殊参数,得到以下错误:
/home/shen/R/x86_64-pc-linux-gnu-
library/3.3/RcppEigen/include/Eigen/src/Core/util/MKL_support.h:57:21:
fatal error: mkl.h: No such file or directory
PS:我对 Microsoft R open 的体验是,它们可以加速 Armadillo 中的正常 R 脚本和函数,而无需执行任何操作。只需在 Microsoft R Open 中正常运行它们即可。
最佳答案
记录我的发现的部分答案。也许其他人可以在此基础上继续发展。
对于此设置,我使用了安装了 R 3.5.0 的 Debian 稳定计算机。我通过this script安装了MKL 。对于编译,我使用了一个附加插件,其中包含更新问题中提供的编译标志以及 -Wno-ignored-attributes
到 silence some unrelated warnings :
library(Rcpp)
registerPlugin(
name = "mkl",
plugin = function(x) {
list(
includes = "#define EIGEN_USE_MKL_ALL",
env = list(PKG_CXXFLAGS = "-DMKL_LP64 -m64 -I/opt/intel/mkl/include -Wno-ignored-attributes",
PKG_LIBS = "${LAPACK_LIBS} ${BLAS_LIBS} ${FLIBS} -L/opt/intel/mkl/lib/intel64 -Wl,--no-as-needed,-rpath,'/opt/intel/mkl/lib/intel64' -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl")
)
}
)
cppFunction('
Eigen::VectorXd mkl_sin(Eigen::VectorXd x) {
return x.array().sin();
}
', plugins = "mkl", depends = "RcppEigen")
mkl_sin((1:10)/10)
#> [1] 0.09983342 0.19866933 0.29552021 0.38941834 0.47942554 0.56464247] 0.64421769 0.71735609 0.78332691 0.84147098
这可以在没有任何警告的情况下工作,因此我得出结论,当 R 与 MKL 作为外部 BLAS/LAPACK 链接时它可以工作。
对于此设置,我使用了基于 Ubuntu 的 Docker 镜像:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install --yes --no-install-recommends \
apt-transport-https \
build-essential \
ca-certificates \
curl \
gfortran \
&& curl -O https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb \
&& dpkg -i packages-microsoft-prod.deb \
&& apt-get update \
&& apt-get install --yes --no-install-recommends \
microsoft-r-open-foreachiterators-3.4.3 \
microsoft-r-open-mkl-3.4.3 \
microsoft-r-open-mro-3.4.3 \
&& Rscript -e 'install.packages("RcppEigen")'
MRO 的问题在于它不包含 MKL header ,而仅包含 MKL 库的一部分:
ls /opt/microsoft/ropen/3.4.3/lib64/R/lib/libmkl_*
/opt/microsoft/ropen/3.4.3/lib64/R/lib/libmkl_core.so
/opt/microsoft/ropen/3.4.3/lib64/R/lib/libmkl_gf_ilp64.so
/opt/microsoft/ropen/3.4.3/lib64/R/lib/libmkl_gf_lp64.so
/opt/microsoft/ropen/3.4.3/lib64/R/lib/libmkl_gnu_thread.so
/opt/microsoft/ropen/3.4.3/lib64/R/lib/libmkl_vml_def.so
/opt/microsoft/ropen/3.4.3/lib64/R/lib/libmkl_vml_mc3.so
特别是缺少上面链接命令中请求的libmkl_intel_lp64.so
。因此,不可能将上述配方与 MRO 一起使用。除了 MRO 之外还可以安装 MKL 并与其链接,但我还没有测试过这一点。
但是,只要 Eigen 退回到 BLAS/LAPACK 方法,就会使用 MKL。与使用引用 BLAS/LAPACK(Windows 默认)的 R 构建相比,这将加快操作速度。
关于package - 将依赖于 RcppEigen 的 R 包与 Microsoft R Open 中的 MKL 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037641/
我正在尝试一个简单的 Hadamard 乘积,即一个矩阵,其中向量 fv 的第一个元素乘以矩阵 的所有第 1 列元素>tm,第二个由 column-2 等 最小的例子: set.seed(123) t
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我已经拟合了一个输出协方差矩阵 S 的回归模型,用于回归参数 B。我需要通过乘以 X 对这个协方差矩阵进行运算,然后得到新的协方差和 stderr vector cov(X * B) = X * co
我是C++的初学者,我想在C++代码中添加一个新的包“CRRTRCppEigen”到RcppEigen,但是在运行一些.bat文件时出现了错误。任何帮助将不胜感激。 这是我想添加到文件“src”中的
我正在用 RcppEigen 编写一些代码,我在 documentation 中遇到了这个不祥的警告。 : One must, of course, be careful not to modify
我是 Rcpp 和 RcppEigen 的新手。如果这个问题很幼稚,我们深表歉意。这是我在 R 中编译的代码, require(RcppEigen) require(inline) body X(a
我是 Rcpp 的新手。我正在尝试使用 R 包 RcppEigen 来获取矩阵的行列式。以下代码保存在一个文件中,我使用sourceCpp来使用它。我用sourceCpp的时候没有编译错误。在 R 中
我有以下代码: #include using namespace Rcpp; using Eigen::MatrixXd; using Eigen::VectorXd; using Eigen::L
我对 Rcpp 很陌生,或者更具体地说 RcppEigen , 并且在纠结如何使用 pi作为我的代码中的常量。该代码在 MCMC 算法中运行了很多次,因此任何速度改进都是完美的。目前,我每次调用该函数
我正在努力加快使用 C++ 快速构建一些用于 R 的稀疏矩阵的速度。但是,我似乎无法使用插入方法更改 Eigen 中稀疏矩阵的单个元素并获得正确的类 dgCMatrix 的 R 对象。下面是一个简单的
我对 Rcpp 很陌生和 RcppEigen可能这就是我自己无法弄清楚的原因: 我只想编写一个包含 Eigen 库的 C++ 函数。为了测试它是否有效,我从 http://people.math.aa
这个问题已经有答案了: Is there a limit on working with matrix in R with Rcpp? (2 个回答) 已关闭 5 年前。 我一直在使用 Rcpp 和
我是 Rcpp 的新手,或者更具体地说是 RcppEigen,并且正在为如何使用 RcppEigen 编译 C++ 函数而苦苦挣扎。这是可能存在问题的C++代码。 #include #include
一切似乎都在我的包中工作,但我想检查制作它的步骤是否正确以及使用“Map”的内存使用情况。 (这是一个简单的示例,介于内联示例和 fastLm() 示例之间。) 这是一个内联函数,它取矩阵每一列的最大
我有一个 R 包,我将包含矩阵代数的 MCMC 算法移动到了 C++使用 RcppEigen包大大提高了速度。 然而,R CMD check给出以下 NOTE在 Linux ( Thanks to R
我在尝试使用 RcppEigen 时遇到了一些问题包裹。我使用了发布的示例 here .该函数有效,但 R 生成了一系列类似的警告(示例如下)。 In file included from examp
我对 predict() 的使用有疑问功能与 RcppArmadillo和 RcppEigen包,当因子变量只有一个水平时。我在下面使用 iris 构建了一个 MWE数据集。 我想首先使用 RcppA
我遵循了迄今为止在本网站或德克、哈德利或其他人发表的笔记中解释的所有程序。但是,由于有关 cpp11 插件的问题,我在构建包时仍然遇到问题。 我使用了 RcppArmadillo.package.sk
我在 Ubuntu (Precise Pengolin) 下安装 lme4 时遇到问题。我收到以下错误消息: ** help *** installing help indices ** buildi
我已经构建了一个自定义包,其中包含一些用 RcppEigen 编写的函数。我还打开了 Microsoft R,并启用了 Intel MKL。如何将 R 包链接到英特尔 MKL 功能? 设置 1: 以下
我是一名优秀的程序员,十分优秀!