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

时间:2011-06-03 15:10:45

标签: 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'

...

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

3 个答案:

答案 0 :(得分:7)

2015年,Rtools在Windows下具有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;
}

我们还需要使用src/Makevars.win编译标志创建openmp。在此示例中,示例src/Makevars将适用于linux:

# src/Makevars.win

PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)

答案 1 :(得分:4)

不,每次R-devel mailing list的讨论。它也出现在Rcpp-devel list

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

答案 2 :(得分:3)

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

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