繁体   English   中英

Rcpp与英特尔MKL多线程

[英]Rcpp with Intel MKL Multithreading

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

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

Makefile文件:

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外部运行一样?

根据这一讨论,我担心这是不可能的。 但是,我想问一下,因为我相信由于英特尔MKL使用OpenMP,也许有一些方法可以使它工作。

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

  1. 创建一个包。

  2. 遵守规则1。

你忽略了这些让你的生活变得艰难。

此外,CRAN上有很多使用OpenMP的软件包 - 研究它们。 您需要了解并了解线程设置 - 请参阅例如执行此操作的RhpcBLASctl包。

最后,您当然可以直接将R与MKL连接; 看看gcbd包及其插图

三年后编辑:有关在.deb系统上轻松安装MKL的详细信息,请参阅此文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM