gpt4 book ai didi

rcpp - RcppParallel 的堆栈不平衡

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:40 27 4
gpt4 key购买 nike

我写了下面的代码来训练自己使用 RcppParallel。这只是一个玩具示例。

// [[Rcpp::depends(RcppParallel)]]
#include <Rcpp.h>
#include <RcppParallel.h>
#include <iostream>
using namespace Rcpp;
using namespace RcppParallel;


struct Lapin : public Worker {
// input pars
const NumericVector input;
const size_t dim;

// outputs a matrix
NumericMatrix output;

// two constructors
Lapin(const NumericVector input, const int dim) : input(input), dim(dim), output(NumericMatrix(dim,dim)) {}

Lapin(const Lapin & jeannot, Split) : input(jeannot.input), dim(jeannot.dim), output(NumericMatrix(dim,dim)) {}

// the working operator
void operator()(size_t begin, size_t end) {
for(size_t k = begin; k < end; k++) {
for(size_t i = 0; i < dim; i++) {
for(size_t j = 0; j < dim; j++) {
output(i,j) += input(k)+i+j;
}
}
}
}

// the join
void join(const Lapin & peter) {
output += peter.output;
}
};

// [[Rcpp::export]]
NumericMatrix f(NumericVector A, size_t dim) {
Lapin groumf(A, dim);
parallelReduce(0, A.length(), groumf);
return groumf.output;
}

这是 R 中发生的事情,在对它进行 sourceCpp 之后:

> f(rep(1,1100), 5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1100 2200 3300 4400 5500
[2,] 2200 3300 4400 5500 6600
[3,] 3300 4400 5500 6600 7700
[4,] 4400 5500 6600 7700 8800
[5,] 5500 6600 7700 8800 9900
> sourceCpp("parallel-matrix-reduce.cpp")
> f(rep(1,1100), 5)
Warning: stack imbalance in '.Call', 6 then 11
[,1] [,2] [,3] [,4] [,5]
[1,] 1100 2200 3300 4400 5500
[2,] 2200 3300 4400 5500 6600
[3,] 3300 4400 5500 6600 7700
[4,] 4400 5500 6600 7700 8800
[5,] 5500 6600 7700 8800 9900

请注意,这种行为是不稳定的:有时,我根本没有任何警告,有时是在第一次运行时...我想我的 session 信息在这里很有用:

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-redhat-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=fr_FR.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] Rcpp_0.11.3

loaded via a namespace (and not attached):
[1] RcppParallel_4.3.3 tools_3.1.2

我提前感谢大家的回答和评论。

编辑 正如德克在下面解释的那样,这是由于在 Worker 中使用了 R 类型,这混淆了垃圾收集器。我改用 Armadillo 矩阵解决了这个问题(我对 RMatrix 有点困惑)。这是更正后的代码:

// [[Rcpp::depends(RcppParallel)]]
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include <iostream>
using namespace Rcpp;
using namespace RcppParallel;


struct Lapin : public Worker {
// input pars
const arma::vec input;
const size_t dim;

// outputs a matrix
arma::mat output;

// two constructors
Lapin(const arma::vec input, const int dim) : input(input), dim(dim), output(arma::mat(dim,dim)) {
output.zeros();
}

Lapin(const Lapin & jeannot, Split) : input(jeannot.input), dim(jeannot.dim), output(arma::mat(dim,dim)) {
output.zeros();
}

// the working operator
void operator()(size_t begin, size_t end) {
for(size_t k = begin; k < end; k++) {
for(size_t i = 0; i < dim; i++) {
for(size_t j = 0; j < dim; j++) {
output(i,j) += input(k)+i+j;
}
}
}
}
// the join
void join(const Lapin & peter) {
output += peter.output;
}
};

// [[Rcpp::export]]
arma::mat f(arma::vec & A, size_t dim) {
Lapin groumf(A, dim);
parallelReduce(0, A.size(), groumf);
return groumf.output;
}

最佳答案

仔细观察 example such as the parallel distance来自 Rcpp 画廊。

使用NumericMatrix而是RMatrix<double> .我会在这里做同样的事情,并且通常提倡在运行并行段时不要依赖与 R 类型的接触。

关于rcpp - RcppParallel 的堆栈不平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27734711/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com