J’ai eu beaucoup de messages d’erreur en essayant d’utiliser openmp dans un code c ++ pour construire mon paquet R sur 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 ne prend-il pas en charge openmp? Est-ce que quelqu’un sait comment utiliser openmp dans les paquets Windows R s’il vous plaît?
Non, par discussions sur la liste de diffusion R-devel . Il est également apparu sur la liste Rcpp-devel .
R lui-même n’utilise pas OpenMP sous Windows, il n’y a donc pas de support dans Rtools. Sur d’autres systèmes d’exploitation, R prend bien entendu en charge OpenMP.
En 2015, Rtools
openmp
charge openmp
sous Windows, ce qui fonctionne bien avec Rcppp
. Voici un exemple simple de création d’une fonction de squares
pour les vecteurs numériques:
// src/example.cpp #include #include // [[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; }
Nous devons également créer src/Makevars.win
avec les openmp
compilation openmp
. Dans cet exemple, l'exemple src/Makevars
fonctionnera sur Linux:
# src/Makevars.win PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)
En référence à ces publications (liste de diffusion R-devel), j’ai essayé d’utiliser OpenMP dans les packages Windows R à l’aide de TDM-GCC . Il semble fonctionner correctement.
Mais je recommande d’utiliser des systèmes d’exploitation officiellement supportés. Je ne sais pas quels problèmes vont arriver.