在 OSX Yosemite 上使用 intel composer 编译的 R 上安装 Rcpp

installing Rcpp on R compiled with intel composer on OSX Yosemite

尽管在我 2014 年后期的 MacBook Pro 运行 Yosemite 上使用英特尔编译器套件 ver.2015.0.077 包括 MKL 成功编译了 R-3.1.2 (概述 here),我无法安装优秀的 Rcpp 包,到目前为止,我已经通过预打包的二进制文件 R for Mavericks 彻底享受了。现在,我想加快速度,特别是使用似乎与默认 clang 不兼容的 OpenMP。我知道 OpenMP/clang 项目,但似乎 Yosemite 上的安装仍然不可靠。

除了在 make -j8 期间多次提到 Warning in strptime 之外,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’

有办法解决这个问题吗?或者,如何切换编译器以便能够在我的 MacBook 上通过 Rcpp 调用 'OpenMP'?

这是我对发生的事情的最佳猜测。在 Rcpp 中,我们为 std::swap() here 提供特化,为简洁起见复制了相关位:

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

}

看起来您的编译器遇到这个 header 的那一刻,还没有看到 std::swap() 的适当模板定义,所以它 barfs。这对我来说似乎令人惊讶,因为我们在 RcppCommon.h 中明确提供了一个 #include <algorithm>,这是默认包含的。或者,也许您的编译器使用的 header 定义 std::swap() 的方式导致这种形式的专业化不起作用——我不确定。

FWIW,cppreference 提倡在定义类型的名称空间内提供这些专业化,而不是 std,以允许 ADL。

您可以尝试在本地修改 Rcpp 源,看看是否可以提供支持 std::swap() 的替代方法(如 cppreference 所建议),然后建议对 [=11 进行上游修改=] 如果一切顺利的话。