传递一个并行安全的 RNG 来运行

Posted

技术标签:

【中文标题】传递一个并行安全的 RNG 来运行【英文标题】:Pass a parallel safe RNG to function 【发布时间】:2020-06-14 03:18:08 【问题描述】:

让我提供一些上下文,因为我不确定是否过度或简化了问题。存在并行工作者,它们执行一系列引导程序,每个工作者都有自己的 RNG,std::mt19937 mersene twister。我想为每个优化引导程序的 Nelder-Mead Simplex 添加一些随机化。问题是如何将RNG从worker传递给函数。下面的示例没有并行化,因为我认为它与我的问题无关。

// [[Rcpp::depends(RcppArmadillo)]
// [[Rcpp::plugins(cpp11)]]
#include <RcppArmadillo.h>
#include <random>

using namespace arma;

//typedef std::mt19937 rng_engine;

template< class rng_engine >

arma::rowvec internal(rng_engine &engine, int counts)

  arma::rowvec output(10);
    // This is wrong
  output = std::unif_rand<double>(0.0, 1.0, 10, engine);
  return output;


// [[Rcpp::export]]
arma::rowvec example( int counts)

  rng_engine engine(1);
  engine.seed(seed);

  return internal( &engine, counts);


/*** R
example( 10 , 1)
*/

【问题讨论】:

【参考方案1】:

好的,这可行,还没有检查它是否是线程安全的。似乎也应该有一种方法可以在没有 for 循环的情况下执行此操作。

// [[Rcpp::depends(RcppArmadillo)]

// [[Rcpp::plugins(cpp11)]]
#include <RcppArmadillo.h>
#include <random>

using namespace arma;


arma::rowvec internal(std::mt19937& engine, int counts)


  arma::rowvec output(counts, arma::fill::zeros);
  std::uniform_real_distribution<double> dist(0, 1);
  for(int f = 0; f< counts; f++)
    output[f] = dist(engine);
  

  return output;


// [[Rcpp::export]]
arma::rowvec example( int counts, int seed)

  std::mt19937 engine(1);
  engine.seed(seed);

  return internal( engine, counts);


/*** R
example( 10 , 1)
*/

【讨论】:

以上是关于传递一个并行安全的 RNG 来运行的主要内容,如果未能解决你的问题,请参考以下文章

RNG 函数 C++

EOS 消息设计并行处理之状态评估

linux Tasklet 实现

使用不同的参数并行运行相同的函数,并知道哪个并行运行在 python 中结束了

拆分数据集并将子集并行传递给函数,然后重新组合结果

你可以将环境变量传递给xcodebuild吗?