gpt4 book ai didi

c++ - 带有英特尔 MKL 多线程的 Rcpp

转载 作者:太空狗 更新时间:2023-10-29 21:39:51 24 4
gpt4 key购买 nike

我编写了一个 C++ 共享库,它使用 Intel MKL 进行 BLAS 操作,它的线程非常漂亮,使用了机器的所有 12 个内核。我现在正尝试使用 RCpp 从我的库中调用一个函数,我发现它是单线程的。对于相同的数据,当从 C++ 调用相同的函数时,它会非常快地使用所有 12 个内核,而当 Rcpp 调用它时,它是单线程的并且需要更长的时间(但结果是一致的)。

英特尔 MKL 因此动态链接到我的库:

生成文件:

LIBRARIES=-lpthread -Wl,--no-as-needed -L<directory>bin -liomp5 -L<bin_directory> -lmkl_mc3 -lmkl_intel_lp64 -lmkl_gnu_thread -ldl  -lmkl_core  -lm  -DMKL_ILP64  -fopenmp
LFLAGS=-O3 -I/opt/intel/composer_xe_2015/mkl/include -std=c++0x -m64

#Compiles the shared library
g++ -fPIC -shared <cpp files> -oliblibrary.so $(LIBRARIES) -O3 -I/opt/intel/composer_xe_2015/mkl/include -std=c++0x -m64

#Compile a controller for R, so that it can be loaded as dyn.load()
PKG_LIBS='`Rscript -e "Rcpp:::LdFlags() $(LIBRARIES) $(LFLAGS)"`' \
PKG_CXXFLAGS='`Rscript -e "Rcpp:::CxxFlags()"` $(LIBRARIES) $(LFLAGS) ' \
R CMD SHLIB fastRPCA.cpp -o../bin/RProgram.so -L../bin -llibrary

然后我在 R 中调用它:

dyn.load("fastRPCA.so", local=FALSE);

请注意,我不希望将 MKL 设置为 R 的 BLAS/LAPACK 替代方案,这样当其他人使用此代码时,他们不必为所有 R 更改它。因此,我只是尝试使用它在 C 代码中。

如何使程序在 Rcpp 中成为多线程,就像在 R 之外运行时一样?

基于 this讨论,我担心这是不可能的。但是,我想问一下,因为我相信既然英特尔 MKL 使用了 OpenMP,也许有某种方法可以让它工作。

最佳答案

使用 R 代码基本上有两个规则:

  1. 创建一个包。

  2. 遵循规则 1。

如果您忽视这些,您的生活就会变得艰难。

此外,CRAN 上有许多使用 OpenMP 的软件包 — 研究这些软件包。您需要了解和了解线程设置——例如参见 RhpcBLASctl执行此操作的包。

最后,您当然可以直接将 R 与 MKL 连接起来;见the gcbd package and its vignette .

三年后编辑:参见this post有关在 .deb 系统上轻松安装 MKL 的详细信息

关于c++ - 带有英特尔 MKL 多线程的 Rcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32039960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com