Установка Rcpp на R, скомпилированную с Intel Composer на OSX Yosemite
Несмотря на успех с компиляцией R-3.1.2
с использованием набора компиляторов Intel версии 2015.0.077, включая MKL
на моем конце 2014 MacBook Pro под управлением Yosemite (обрисовано в общих чертах здесь), я не могу установить отличный Rcpp
пакет, которым я до сих пор наслаждаюсь через предварительно упакованный бинарный файл R
для Маверикс. Теперь я хотел бы немного ускорить процесс, в частности использовать OpenMP
это, казалось бы, несовместимо с дефолтом clang
, Я знаю о OpenMP/clang
проект, но кажется, что установка на Yosemite все еще хитрая.
Помимо нескольких упоминаний Warning in strptime
в течение make -j8
, make install
завершается успешно, и я могу установить большинство пакетов на только что скомпилированный R
, Rcpp
Пакет тем не менее терпит неудачу с:
> install.packages("Rcpp")
Warning in strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) :
unknown timezone 'Asia/Kolkata'
Warning in strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) :
unknown timezone 'GMT'
Warning in strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) :
unknown timezone 'America/New_York'
* installing *source* package ‘Rcpp’ ...
** package ‘Rcpp’ successfully unpacked and MD5 sums checked
Warning in as.POSIXlt.POSIXct(x, tz) : unknown timezone 'GMT'
Warning in as.POSIXlt.POSIXct(x, tz) :
unknown timezone 'America/New_York'
** libs
icpc -I/Users/username/R-3.1.2/include -DNDEBUG -I../inst/include/ -I/sw/include -I/usr/local/include -fPIC -g -O3 -c Date.cpp -o Date.o
In file included from ../inst/include/Rcpp/Vector.h(69),
from ../inst/include/Rcpp.h(38),
from Date.cpp(31):
../inst/include/Rcpp/vector/swap.h(35): error: "swap" is not a class or function template name in the current scope
RCPP_GENERATE_SWAP(generic_proxy,VECSXP)
^
In file included from ../inst/include/Rcpp/Vector.h(69),
from ../inst/include/Rcpp.h(38),
from Date.cpp(31):
../inst/include/Rcpp/vector/swap.h(36): error: "swap" is not a class or function template name in the current scope
RCPP_GENERATE_SWAP(generic_proxy,EXPRSXP)
^
In file included from ../inst/include/Rcpp/Vector.h(69),
from ../inst/include/Rcpp.h(38),
from Date.cpp(31):
../inst/include/Rcpp/vector/swap.h(37): error: "swap" is not a class or function template name in the current scope
RCPP_GENERATE_SWAP(string_proxy,STRSXP)
^
Date.cpp(562): warning #437: reference to local variable of enclosing function is not allowed
2 * sizeof *sp + 4 * TZ_MAX_TIMES];
^
compilation aborted for Date.cpp (code 2)
make: *** [Date.o] Error 2
ERROR: compilation failed for package ‘Rcpp’
Есть ли способ это исправить? В качестве альтернативы, как я могу переключать компиляторы, чтобы иметь возможность вызывать OpenMP через Rcpp
на моем MacBook?
1 ответ
Вот мое лучшее предположение о том, что происходит. В Rcpp
Мы предоставляем специализации для std::swap()
здесь с соответствующими битами, скопированными для краткости:
namespace std {
#undef RCPP_GENERATE_SWAP
#define RCPP_GENERATE_SWAP(TYPE,RTYPE) \
template<> inline void swap< Rcpp::internal::TYPE<RTYPE> >( \
Rcpp::internal::TYPE<RTYPE>& a , \
Rcpp::internal::TYPE<RTYPE>& b) { \
a.swap(b) ; \
}
RCPP_GENERATE_SWAP(generic_proxy,VECSXP)
RCPP_GENERATE_SWAP(generic_proxy,EXPRSXP)
RCPP_GENERATE_SWAP(string_proxy,STRSXP)
#undef RCPP_GENERATE_SWAP
}
Похоже, в тот момент, когда ваш компилятор встречает этот заголовок, соответствующее определение шаблона для std::swap()
еще не было видно и так бубнов. Это кажется мне удивительным, так как мы предоставляем #include <algorithm>
в RcppCommon.h
, который включен по умолчанию. Или, возможно, заголовки, используемые вашим компилятором, определяют std::swap()
таким образом, что эта форма специализации просто не работает - я не уверен.
FWIW, cppreference выступает за предоставление этих специализаций в пространстве имен, в котором определены типы, а не std
, чтобы учесть ADL.
Вы можете попробовать изменить источники Rcpp локально, чтобы посмотреть, можете ли вы предоставить альтернативный способ поддержки std::swap()
(как предложено cppreference
), а затем предлагает восходящую модификацию Rcpp
а также, если все кажется хорошо.