在Windows R中使用openmp,rtools是否支持openmp?

当我尝试在c ++代码中使用openmp来构buildWindows 7上的R包时,我得到了很多错误信息:

c:/rtools/mingw/bin/../lib/gcc/mingw32/4.5.0/libgomp.a(parallel.o):(.text+0x19): undefined reference to `_imp__pthread_getspecific' c:/rtools/mingw/bin/../lib/gcc/mingw32/4.5.0/libgomp.a(parallel.o):(.text+0x7a): undefined reference to `_imp__pthread_mutex_lock' c:/rtools/mingw/bin/../lib/gcc/mingw32/4.5.0/libgomp.a(env.o):(.text+0x510): undefined reference to `_imp__pthread_mutex_init' ... 

Rtools不支持openmp吗? 有谁知道如何在Windows R包中使用openmp吗?

不,根据R-devel邮件列表的讨论。 它也出现在Rcpp-devel列表中 。

R本身不使用Windows上的OpenMP,所以在Rtools中不支持。 在其他操作系统上,R当然有OpenMP支持。

在2015年, Rtools在Windows下支持Rtools支持,与Rcppp很好的搭配。 下面是一个简单的例子,为数字矢量创建一个squares函数:

 // src/example.cpp #include <Rcpp.h> #include <omp.h> // [[Rcpp::plugins(openmp)]]] // [[Rcpp::export]] Rcpp::NumericVector squares (Rcpp::NumericVector data) { Rcpp::NumericVector result(data.size()); #pragma omp parallel { Rcpp::Rcout << omp_get_num_threads() << std::endl; for (int i = 0; i < data.size(); i++) { result[i] = data[i] * data[i]; } } return result; } 

我们还需要用src/Makevars.win编译标志创建src/Makevars.win 。 在这个例子中,样本src/Makevars将在linux上运行:

 # src/Makevars.win PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) 

通过引用这些帖子 (R-devel邮件列表),我尝试使用TDM-GCC在Windows R包中使用OpenMP。 它似乎运行正确。

但我建议使用官方支持的操作系统。 我不知道会发生什么问题。