emd*_*oll 5 c++ multithreading r rcpp
我使用 Rcpp 和 OpenMP 在 C++ 中进行并行计算。我读过在 Rcpp::List 线程中访问/设置元素安全吗?看来在线程代码块中使用 Rcpp 是危险的。但在 for 循环中读取或写入 Rcpp NumericVectors 是很常见的,例如https://gallery.rcpp.org/articles/hierarchical-risk-parity/。
下面是我写的。任务很简单。我首先在(并行)for 循环之外声明NumericVector一个具有大尺寸的a 。n我做了一些计算并填充NumericVector使用索引的每个元素i。完成后,我计算出所需的分位数。
#include <Rcpp.h>
#include <omp.h>
// [[Rcpp::export]]
double foo(const int n, const int nthreads) {
Rcpp::NumericVector out(n);
#pragma omp parallel for num_threads(nthreads)
for (int i = 0; i < n; ++i) {
out[i] = doSomething();
}
Rcpp::Environment stats("package:stats");
Rcpp::Function quantile = stats["quantile"];
return Rcpp::as<double>(quantile(out, Rcpp::Named("probs") = 0.95));
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题。
是否有任何理由使用其他容器(例如std::vector<double>)而不是NumericVector为了线程安全?我测试了上面的代码并std::vector<double>得到了相同的结果。听说两者之间的转换涉及到深拷贝。如果我使用,那么调用std::vector<double>时会发生深度复制吗?quntile()
如果使用安全的话,就性能而言,直接返回并在R中应用NumericVector是不是更好?NumericVectorquntile()
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |