在 R 包内的 window 上使用带有 Rcpp 函数的 doParallel
Use doParallel with Rcpp function on window inside an R package
我从这个 post 了解到,在 window 上使用带有 doParallel 的 Rcpp
函数的最简单方法是构建一个包。我目前正在构建一个 R 包,我需要并行化包中的一些任务。我有一个 Rcpp 函数和一个对 Rcpp 函数执行循环的 R 函数。这些功能将在我的包中。如何构造 R 函数?
根据上面的 post,用 Rcpp 函数构建第一个包并在 R 函数的第二个包中调用这个包会更容易。有没有办法将这两个功能放在同一个包中?
是的,您可以在包中放入任意数量的函数。建议所有内容都在 R 包中的原因是,否则您将不得不在您旋转代码的每个线程或节点上编译代码。这是因为 Rcpp 函数是在本地编译的,只有线程特定的指针引用。特别是,请参阅以下内容中的讨论:
.
示例包为:
https://github.com/r-pkg-examples/rcpp-and-doparallel
特别是,R 函数应该正确设置和拆除并行后端。
mean_parallel_compute = function(n, mean = 0, sd = 1,
n_sim = 1000,
n_cores = parallel::detectCores()) {
# Construct cluster
cl = parallel::makeCluster(n_cores)
# After the function is run, close the cluster.
on.exit(parallel::stopCluster(cl))
# Register parallel backend
doParallel::registerDoParallel(cl)
# Compute estimates
estimates = foreach::foreach(i = iterators::icount(n_sim), # Perform n simulations
.combine = "rbind", # Combine results
# Self-load
.packages = "Rcpp2doParallel") %dopar% {
random_data = rnorm(n, mean, sd)
result = mean_rcpp(random_data) # or use Rcpp2doParallel::mean_rcpp()
result
}
estimates
}
要通过 R CMD check
确保具有以下 roxygen2
导入标签:
#' @importFrom foreach %dopar% foreach
#' @importFrom iterators icount
#' @importFrom doParallel registerDoParallel
此外,请确保 DESCRIPTION
具有以下内容:
LinkingTo:
Rcpp
Imports:
doParallel,
Rcpp,
foreach,
iterators,
parallel
其他一些示例:
- Using Rcpp within parallel code via snow to make a cluster
我从这个 post 了解到,在 window 上使用带有 doParallel 的 Rcpp
函数的最简单方法是构建一个包。我目前正在构建一个 R 包,我需要并行化包中的一些任务。我有一个 Rcpp 函数和一个对 Rcpp 函数执行循环的 R 函数。这些功能将在我的包中。如何构造 R 函数?
根据上面的 post,用 Rcpp 函数构建第一个包并在 R 函数的第二个包中调用这个包会更容易。有没有办法将这两个功能放在同一个包中?
是的,您可以在包中放入任意数量的函数。建议所有内容都在 R 包中的原因是,否则您将不得不在您旋转代码的每个线程或节点上编译代码。这是因为 Rcpp 函数是在本地编译的,只有线程特定的指针引用。特别是,请参阅以下内容中的讨论:
示例包为:
https://github.com/r-pkg-examples/rcpp-and-doparallel
特别是,R 函数应该正确设置和拆除并行后端。
mean_parallel_compute = function(n, mean = 0, sd = 1,
n_sim = 1000,
n_cores = parallel::detectCores()) {
# Construct cluster
cl = parallel::makeCluster(n_cores)
# After the function is run, close the cluster.
on.exit(parallel::stopCluster(cl))
# Register parallel backend
doParallel::registerDoParallel(cl)
# Compute estimates
estimates = foreach::foreach(i = iterators::icount(n_sim), # Perform n simulations
.combine = "rbind", # Combine results
# Self-load
.packages = "Rcpp2doParallel") %dopar% {
random_data = rnorm(n, mean, sd)
result = mean_rcpp(random_data) # or use Rcpp2doParallel::mean_rcpp()
result
}
estimates
}
要通过 R CMD check
确保具有以下 roxygen2
导入标签:
#' @importFrom foreach %dopar% foreach
#' @importFrom iterators icount
#' @importFrom doParallel registerDoParallel
此外,请确保 DESCRIPTION
具有以下内容:
LinkingTo:
Rcpp
Imports:
doParallel,
Rcpp,
foreach,
iterators,
parallel
其他一些示例:
- Using Rcpp within parallel code via snow to make a cluster