En utilisant openmp dans Windows R, rtools supporte-t-il openmp?

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.