1

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

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

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

4

2 回答 2

1

您也可以在 R 中使用:

system("R CMD COMPILE filename.c CFLAGS=-fopenmp")
system("R CMD SHLIB filename.o")
于 2012-12-21T10:07:01.610 回答
0

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

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 / Ubuntu 系统上的标准 R 2.15.1。

于 2012-09-06T19:59:03.430 回答