当我尝试在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。 它似乎运行正确。
但我建议使用官方支持的操作系统。 我不知道会发生什么问题。