代码之家  ›  专栏  ›  技术社区  ›  thc

RcppParallel RVector push\u back或类似的东西?

  •  1
  • thc  · 技术社区  · 8 年前

    我正在使用RcppParallel来加速一些计算。然而,我在这个过程中内存不足,所以我想将结果保存在通过一些相关阈值的并行循环中。下面是一个玩具示例来说明我的观点:

    #include <Rcpp.h>
    #include <RcppParallel.h>
    using namespace Rcpp;
    
    // [[Rcpp::depends(RcppParallel)]]
    // [[Rcpp::plugins(cpp11)]]
    struct Example : public RcppParallel::Worker {
      RcppParallel::RVector<double> xvals, xvals_output, yvals;
      Example(const NumericVector & xvals, NumericVector & yvals, NumericVector & xvals_output) : 
        xvals(xvals), xvals_output(xvals_output), yvals(yvals) {}
      void operator()(std::size_t begin, size_t end) {
        for(std::size_t i=begin; i < end; i++) {
          double y = xvals[i] * (xvals[i] - 1);
          // if(y < 0) {
          //   xvals_output.push_back(xvals[i]);
          //   yvals.push_back(y);
          // }
          xvals_output[i] = xvals[i];
          yvals[i] = y;
        }
      }
    };
    // [[Rcpp::export]]
    List find_values(NumericVector xvals) {
      NumericVector xvals_output(xvals.size());
      NumericVector yvals(xvals.size());
      Example ex(xvals, yvals, xvals_output);
      parallelFor(0, xvals.size(), ex);
      List L = List::create(xvals_output, yvals);
      return(L);
    }
    

    R代码为:

    find_values(seq(-10,10, by=0.5))
    

    注释掉的代码就是我想要做的。

    也就是说,我想初始化一个空向量,只附加通过某个阈值的y值以及相关的x值。

    在我的实际使用中,我正在计算一个MxN矩阵,因此内存是一个问题。

    解决这个问题的正确方法是什么?

    1 回复  |  直到 8 年前
        1
  •  2
  •   thc    8 年前

    如果有人遇到过类似的问题,这里有一个使用TBB中的“concurrent\u vector”的解决方案(RcppParallel在引擎盖下使用,可以作为标题使用)。

    #include <Rcpp.h>
    #include <RcppParallel.h>
    #include <tbb/concurrent_vector.h>
    using namespace Rcpp;
    
    // [[Rcpp::depends(RcppParallel)]]
    // [[Rcpp::plugins(cpp11)]]
    struct Example : public RcppParallel::Worker {
      RcppParallel::RVector<double> xvals;
      tbb::concurrent_vector< std::pair<double, double> > &output;
      Example(const NumericVector & xvals, tbb::concurrent_vector< std::pair<double, double> > &output) : 
        xvals(xvals), output(output) {}
      void operator()(std::size_t begin, size_t end) {
        for(std::size_t i=begin; i < end; i++) {
          double y = xvals[i] * (xvals[i] - 1);
          if(y < 0) {
            output.push_back( std::pair<double, double>(xvals[i], y) );
          }
        }
      }
    };
    // [[Rcpp::export]]
    List find_values(NumericVector xvals) {
      tbb::concurrent_vector< std::pair<double, double> > output;
      Example ex(xvals,output);
      parallelFor(0, xvals.size(), ex);
      NumericVector xout(output.size());
      NumericVector yout(output.size());
      for(int i=0; i<output.size(); i++) {
        xout[i] = output[i].first;
        yout[i] = output[i].second;
      }
      List L = List::create(xout, yout);
      return(L);
    }
    

    输出:

    > find_values(seq(-10,10, by=0.5))
    [[1]]
    [1] 0.5
    
    [[2]]
    [1] -0.25
    
    推荐文章