当我尝试在 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 吗?
最佳答案
2015 年,Rtools
支持 Windows 下的 openmp
,与 Rcppp
配合良好。下面是一个为数值 vector 创建 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;
}
我们还需要使用 openmp
编译标志创建 src/Makevars.win
。在此示例中,示例 src/Makevars
将在 linux 上运行:
# src/Makevars.win
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)
关于c++ - 在 Windows R 中使用 openmp,rtools 是否支持 openmp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6228924/