- 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/
我正在尝试为 R 中的贝叶斯回归模型编写 Gibbs 采样器,但在运行代码时遇到问题。 sigma.update 函数中的测试版似乎发生了一些事情。当我运行代码时,我收到一条错误消息“x %*% be
我是编程和生物信息学的初学者。因此,非常感谢您的理解。我尝试使用 Gibbs 采样开发一个用于主题搜索的 python 脚本,如 Coursera 类(class)“Finding Hidden
我有一个由函数 lda.collapsed.gibbs.sampler 生成的模型,来自 lda 包,我需要知道顶部单词的“相关性”。使用时 top.topic.words(result$to
作为练习,我重写了博文 Gibbs sampler in various languages (revisited) 中的示例程序通过达伦威尔金森。 代码出现在下面。这段代码在我(5 岁)机器上运行大
我已经实现了一个 Gibbs 采样器来生成纹理图像。根据beta参数(shape(4)数组),我们可以生成各种纹理。 这是我使用 Numpy 的初始函数: def gibbs_sampler(img_
阅读docs of scikit-learn我了解到 DPGMM 类背后的实现使用变分推理而不是传统的 Gibbs 采样。 尽管如此,在通过 this Edwin Chen's popular pos
我正在尝试求解一个非线性系统,该系统将使用拉格朗日方法和指数公式来最小化吉布斯自由能。方程中已包含指数形式 Y1...Y6 的拉格朗日量,随后将其转换为化学物质 n1...n9 的摩尔数。 问题是 f
我想从后验采样,其中 LambdaA 和 LambdaB 是 A 和 B 的指数率。另外,y 是 r.v. 的观测值。 后验由 并且出于数字原因,我正在获取此函数的日志。 数据: n1 ,0,log(
概览:我对并行化(跨链)Gibbs 采样器感兴趣,以解决我遇到的非平凡回归问题 already implemented通过 Rcpp/RcppEigen 串行。我已阅读 RcppParallel 的文
我正在寻找一个多变量 GMM 的 C++ 实现,它使用基于 Gibbs 采样的方法来拟合/分类(而不是通常的基于 EM),以便能够充分利用先验信息并添加在限制条件下。通常称为狄利克雷过程高斯混合模型或
更新:内存 View 获胜。Cython 使用类型化内存 View :0.0253449 特别感谢 lothario,他指出了几个关键的变化。 荒谬。当然现在的问题是,似乎不能对它们做太多算术(加法和
我是一名优秀的程序员,十分优秀!