在 R 的 par*apply 函数中使用 Rcpp 函数
Using Rcpp functions inside of R's par*apply functions from the parallel package
我试图了解在并行化环境中 Rcpp::sourceCpp()
调用背后发生的事情。最近,这个问题在以下问题中得到了部分解决:Using Rcpp function in parLapply on Windows.
在这个post中,德克说,
"You need to run the sourceCpp() call in each spawned process, or else get them your code."
这是对提问者使用 Rcpp 函数分发给工作进程的回应。发问者通过以下方式发送 Rcpp 函数:
clusterExport(cl = cl, varlist = "payoff")
我很困惑为什么这不起作用。我的想法是,这就是 clusterExport()
的 objective 的用途。
这里的问题是,由于二进制文件链接到 R 的方式,编译后的代码不会 "exportable" 在没有嵌入包中的情况下生成进程过程。
传统上,clusterExport()
语句允许将 R 特定代码分发给工作人员。
通过在 Rcpp 函数上使用 clusterExport()
,您只会收到 R 声明和 而不是 底层共享库.也就是说,Attributes.R中给出的R CMD SHLIB
不共享/导出给worker。结果,当调用 worker 上的 Rcpp
函数时,R 找不到正确的共享库。
取上一题的函数:
Rcpp::cppFunction("NumericVector payoff( double strike, NumericVector data) {
return pmax(data - strike, 0);
}")
注意: 我使用 cppFunction()
而不是 sourceCpp()
但结果 等效 因为 cppFunction()
calls sourceCpp()
to create the function.
键入函数名称:
payoff
产生带有共享库指针的 R 声明。
function (strike, data)
.Primitive(".Call")(<pointer: 0x1015ec130>, strike, data)
此共享库仅在编译函数的进程中可用。
因此,为什么将编译后的代码嵌入包中然后分发包总是理想的。
我试图了解在并行化环境中 Rcpp::sourceCpp()
调用背后发生的事情。最近,这个问题在以下问题中得到了部分解决:Using Rcpp function in parLapply on Windows.
在这个post中,德克说,
"You need to run the sourceCpp() call in each spawned process, or else get them your code."
这是对提问者使用 Rcpp 函数分发给工作进程的回应。发问者通过以下方式发送 Rcpp 函数:
clusterExport(cl = cl, varlist = "payoff")
我很困惑为什么这不起作用。我的想法是,这就是 clusterExport()
的 objective 的用途。
这里的问题是,由于二进制文件链接到 R 的方式,编译后的代码不会 "exportable" 在没有嵌入包中的情况下生成进程过程。
传统上,clusterExport()
语句允许将 R 特定代码分发给工作人员。
通过在 Rcpp 函数上使用 clusterExport()
,您只会收到 R 声明和 而不是 底层共享库.也就是说,Attributes.R中给出的R CMD SHLIB
不共享/导出给worker。结果,当调用 worker 上的 Rcpp
函数时,R 找不到正确的共享库。
取上一题的函数:
Rcpp::cppFunction("NumericVector payoff( double strike, NumericVector data) {
return pmax(data - strike, 0);
}")
注意: 我使用 cppFunction()
而不是 sourceCpp()
但结果 等效 因为 cppFunction()
calls sourceCpp()
to create the function.
键入函数名称:
payoff
产生带有共享库指针的 R 声明。
function (strike, data)
.Primitive(".Call")(<pointer: 0x1015ec130>, strike, data)
此共享库仅在编译函数的进程中可用。
因此,为什么将编译后的代码嵌入包中然后分发包总是理想的。