c-将R CMD SHLIB与OpenMP一起使用不用于包构建



我正在编写的(R)程序一度能够编写包含OpenMP指令的C源代码文件,以加快生成的程序的速度(这些文件主要包含一组微分方程,其结果将写入数组-由于这些步骤可以独立执行,我认为使用omp部分将它们并行化是个好主意)。由于以这种方式生成的文件应该在我的程序的另一部分中使用,我也使用R在运行时使用system(R CMD SHLIB...)对它们进行编译,因为这种方法似乎具有使用R CMD SHLIB的优点,即不需要对用户强加特定的编译器。

我现在面临的问题是,我无法将-fopenmp(或-openmp)编译器指令传递给R CMD SHLIB,并且在不构建R包时,不可能使用提供额外编译器标志的Makevars文件(理想情况下是$SHLIB_OPENMP_CFLAGS)——在这种情况下,我不会这样做,所以R CMD SHLIB编译我给它的文件。然而,如果没有OpenMP并行化,因为我看不出在这种情况下如何将相应的标志传递给CCD_ 8。

无论如何,是否有可能将R CMD SHLIB用于此任务,或者我是否必须通过内部指定编译器进行OpenMP编译来牺牲可移植性?

您也可以在R中使用:

system("R CMD COMPILE filename.c CFLAGS=-fopenmp")
system("R CMD SHLIB filename.o")

如果必须使用R CMD SHLIB而不是Makefile或包,我认为您需要修改环境变量,如PKG_CPPFLAGSPKG_CXXFLAGS,您可以通过Sys.setenv()从R内部进行修改。

R本身现在使用OpenMP,您想要的编译器选项在最近的R系统上可用:

edd@max:~$ grep OPENMP /etc/R/Makeconf 
SHLIB_OPENMP_CFLAGS = -fopenmp
SHLIB_OPENMP_CXXFLAGS = -fopenmp
SHLIB_OPENMP_FCFLAGS = -fopenmp
SHLIB_OPENMP_FFLAGS = -fopenmp
edd@max:~$ 

这是来自Debian/Uubuntu系统上的标准R 2.15.1。

最新更新