- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
概览:我对并行化(跨链)Gibbs 采样器感兴趣,以解决我遇到的非平凡回归问题 already implemented通过 Rcpp/RcppEigen 串行。我已阅读 RcppParallel
的文档和 RcppThread
我想知道我对并行化此代码所涉及的挑战的理解是否准确,以及我提出的使用 RcppThread
的伪代码是否可行。
编程挑战:此回归问题需要在 Gibbs 采样器的每次迭代中反转更新的设计矩阵。因此,任何新矩阵(每个链一个)都需要是“线程安全的”。也就是说,不存在一个线程写入另一个线程也可能尝试访问的内存的危险。如果完成此操作,我便可以通过为 Rcpp::parallelFor
指定用于分配样本的唯一索引来绘制和存储回归系数样本 (beta)。我想知道在哪里/如何最好地初始化这些特定于线程的矩阵?。请参阅下文了解我的总体概念理解,并首先猜测我如何基本上使用并行分配样本的样本原则来并行分配 X。 注意 这是假设 Eigen 对象可以并发索引访问,就像我在 RcppThread
文档中看到的访问 std::vector<> 内存的方式一样。
#include "RcppEigen.h>
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppThread)]]
// [[Rcpp::depends(RcppEigen)]]
// Sampler class definition
#include "Sampler.h"
#include "RcppThread.h"
// [[Rcpp::export]]
Eigen::ArrayXXd fancyregression(const Eigen::VectorXd &y, // outcome vector
const Eigen::MatrixXd &Z, // static sub-matrix of X
const int &num_iterations,
const int &num_chains_less_one,
const int &seed,
...)
{
std::mt19937 rng;
rng(seed);
const int dim_X = get_dim_X(Z,...);
const int n = y.rows();
const int num_chains = num_chains_less_one + 1;
Eigen::ArrayXXd beta_samples;
beta_samples.setZero(num_iterations,num_chains*dim_X);
Eigen::MatrixXd shared_X(n,dim_X*num_chains);
// sampler object only has read access to its arguments
SamplerClass sampler(y,Z,...);
//chain for loop
RcppThread::parallelFor(0, num_chains_less_one,[&beta, &shared_X, &n,&sampler, &dim_X, &rng](unsigned int chain){
// chain specific iteration for loop
for(unsigned int iter_ix = 0; iter_ix < num_iterations ; iter_ix ++){
X.block(0,dim_X*chain,n,dim_X) = sampler.create_X(rng);
beta_samples(iter_ix,dim_X*chain) = sampler.get_beta_sample(X,rng);
}
});
return(beta_samples);
}
最佳答案
“在哪里/如何最好地初始化这些线程特定的矩阵?”
您正在寻找特定于线程的资源。这是一个准系统示例:
#include <Rcpp.h>
#include <RcppParallel.h>
using namespace Rcpp;
using namespace RcppParallel;
// [[Rcpp::depends(RcppParallel)]]
// [[Rcpp::plugins(cpp11)]]
struct Test : public Worker {
tbb::enumerable_thread_specific<bool> printonce;
Test() : printonce(false) {}
void operator()(std::size_t begin, std::size_t end) {
tbb::enumerable_thread_specific<bool>::reference p = printonce.local();
if(!p) { // print once per thread
std::cout << 1;
p= true;
}
}
};
// [[Rcpp::export(rng = false)]]
void test() {
Test x{};
parallelFor(0, 10000, x);
}
RcppParallel 在底层使用 TBB(适用于大多数操作系统),因此您可以使用和查找 TBB 中的任何内容。
请注意,由于它是一个线程,因此必须在某处分配本地资源,因此您需要使用类/仿函数而不是 lambda。
关于r - 在 R : RcppThread vs. RcppParallel 中并行化一个非平凡的 Gibbs 采样器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64613798/
我想编写代码使用 RcppParallel 计算 v^T Av。这里 v 是一个大小为 n 的 vector ,A 是一个 n×n 矩阵。我的想法是以并行方式评估 Av,然后计算该 vector 与
我写了下面的代码来训练自己使用 RcppParallel。这只是一个玩具示例。 // [[Rcpp::depends(RcppParallel)]] #include #include #incl
灵感来自文章 http://gallery.rcpp.org/articles/parallel-distance-matrix/ ,我尝试使用 RcppParallel 在高维参数空间中运行强力搜索
我正在尝试使用 RcppParallel 并行添加(大)向量。这就是我想出的办法。 // [[Rcpp::depends(RcppParallel)]] #include #include #in
我有一个矩阵,我想为它计算第 i 行和每隔一行(即我想要 i成对距离矩阵的第 th 行)。 #include #include #include #include //#include #i
以下玩具示例为 parallelFor工作正常( f2 是 f1 的并行版本): // [[Rcpp::depends(RcppParallel)]] // [[Rcpp::depends(RcppA
我正在学习在我的工作中使用 RcppParallel,并试图安装一个使用 Rcpp.package.skeleton() 制作的简单包。该软件包包含三个源文件,即 Rcpp 的 HelloWorld
我需要与 RcppParallel::RMatrix 合作.以前我曾与 Rcpp只要。但现在为 RcppParallel我需要一份文件,例如 Rcpp拥有。 例如 我 Rcpp::NumericMat
我是 C++ 编程的新手,正在尝试通过 R 试验 Rcpp。我创建了一个函数来从一个字符串中生成所有可能的 k-mers。它以它的串行形式运行良好: #include #include #incl
我有一个任务需要处理一个大型矩阵(数百万行,数百列)字符串。每行操作都是独立的。因此,我想利用一些并行计算来提高整个项目的速度。 如果我为数值矩阵构建myWorker,如下所示,我能够编译代码而不会出
我正在使用此 Rcpp 代码执行 quickselect在值向量上,即在 O(n) 时间内从向量中获取第 k 个最大元素(我将其保存为 qselect.cpp): // [[Rcpp::depends
概览:我对并行化(跨链)Gibbs 采样器感兴趣,以解决我遇到的非平凡回归问题 already implemented通过 Rcpp/RcppEigen 串行。我已阅读 RcppParallel 的文
我想在 RcppPralel worker 中使用线程安全函数指针。但是我已经对这个小例子产生了疑问。无论我是在包中使用它并在 DESCRIPTION 文件中添加 SystemRequirements
我是一名优秀的程序员,十分优秀!