在 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 进行上游修改=] 如果一切顺利的话。
尽管在我 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 进行上游修改=] 如果一切顺利的话。