Используя openmp в Windows R, поддерживает ли rtools openmp?
Я получил много сообщений об ошибках при попытке использовать openmp в коде C++ для сборки моего пакета R на Windows 7:
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? Кто-нибудь знает, как использовать openmp в пакетах Windows R, пожалуйста?
3 ответа
Нет, согласно обсуждениям в списке рассылки R-devel. Это также попало в список Rcpp-devel.
Сам R не использует OpenMP в Windows, поэтому в Rtools нет поддержки. На других ОС R, конечно, есть поддержка OpenMP.
В 2015 году Rtools
имеет openmp
поддержка под Windows, которая хорошо сочетается с 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)
Ссылаясь на эти сообщения (список рассылки R-devel), я попытался использовать OpenMP в пакетах Windows R с помощью TDM-GCC. Кажется, работает правильно.
Но я рекомендую использовать официально поддерживаемые ОС. Я не знаю, какие проблемы произойдут.