Установка 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 а также, если все кажется хорошо.

Другие вопросы по тегам