use*_*819 4 c++ windows r openmp
尝试在c ++代码中使用openmp在Windows 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'
...
Run Code Online (Sandbox Code Playgroud)
Rtools不支持openmp吗?有谁知道如何在Windows R包中使用openmp吗?
2015年,在Windows下Rtools提供openmp支持,可以很好地使用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;
}
Run Code Online (Sandbox Code Playgroud)
我们还需要src/Makevars.win使用openmp编译标志进行创建.在此示例中,示例src/Makevars将在linux上运行:
# src/Makevars.win
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)
Run Code Online (Sandbox Code Playgroud)
不,根据R-devel 邮件列表上的讨论。它也出现在Rcpp-devel 列表中。
R本身在Windows上不使用OpenMP,因此Rtools中不支持。在其他操作系统上,R 当然也支持 OpenMP。