gpt4 book ai didi

r - 多次调用同一个 Rcpp 函数时返回不同的结果

转载 作者:行者123 更新时间:2023-12-04 10:49:02 25 4
gpt4 key购买 nike

我已经使用 RcppParallel 编写了分组总和的并行实现。

// [[Rcpp::depends(RcppParallel)]]
#include <Rcpp.h>
#include <RcppParallel.h>
using namespace Rcpp;
using namespace RcppParallel;

struct SumsG: public Worker
{
const RVector<double> v;
const RVector<int> gi;

RVector<double> sg;

SumsG(const NumericVector v, const IntegerVector gi, NumericVector sg): v(v), gi(gi), sg(sg) {}
SumsG(const SumsG& p, Split): v(p.v), gi(p.gi), sg(p.sg) {}

void operator()(std::size_t begin, std::size_t end) {
for (std::size_t i = begin; i < end; i++) {
sg[gi[i]] += v[i];
}
}

void join(const SumsG& p) {
for(std::size_t i = 0; i < sg.length(); i++) {
sg[i] += p.sg[i];
}
}
};

// [[Rcpp::export]]
List sumsingroups(NumericVector v, IntegerVector gi, int ni) {
NumericVector sg(ni);
SumsG p(v, gi, sg);
parallelReduce(0, v.length(), p);

return List::create(_["sg"] = p.sg);
}

它使用 Rcpp::sourceCpp 编译.现在,当我从 R sumsingroups(1:10, rep(0:1, each = 5), 2) 调用它时有几次我得到了正确的答案( 15 40 ),然后又得到了一些不同的答案(通常是正确答案的乘法)。运行
res <- sumsingroups(1:10, rep(0:1, each = 5), 2)
for(i in 1:1000) {
tmp <- sumsingroups(1:10, rep(0:1, each = 5), 2)
if(res[[1]][1] != tmp[[1]][1]) break
Sys.sleep(0.1)
}

在随机迭代返回时中断
$sg
[1] 60 160

或者
$sg
[1] 30 80

我是新来的 RcppRcppParallel并且不知道是什么导致了这种行为。

更新。没有帮助的事情:
  • 已添加 for (std::size_t i = 0; i < sg.length(); i++) sg[i] = 0;
    两个构造函数。
  • 更改了名称,使它们在Worker定义和功能实现。
  • 最佳答案

    尝试这个。

    #include <Rcpp.h>
    using namespace Rcpp;
    // [[Rcpp::depends(RcppParallel)]]
    #include <RcppParallel.h>

    using namespace RcppParallel;
    struct SumsInGroups5: public Worker
    {
    const RVector<double> v;
    const RVector<int> g;

    std::vector<double> s;

    SumsInGroups5(const NumericVector v, const IntegerVector g): v(v), g(g), s(*std::max_element(g.begin(), g.end()) + 1, 0.0){ }

    SumsInGroups5(const SumsInGroups5& p, Split): v(p.v), g(p.g), s(*std::max_element(g.begin(), g.end()) + 1, 0.0) {}

    void operator()(std::size_t begin, std::size_t end) {
    for (std::size_t i = begin; i < end; ++i) {
    s[g[i]]+=v[i];
    }

    }

    void join(const SumsInGroups5& rhs) {
    for(std::size_t i = 0; i < s.size(); i++) {
    s[i] += rhs.s[i];
    }
    }
    };

    // [[Rcpp::export]]
    NumericVector sg5(NumericVector v, IntegerVector g) {
    SumsInGroups5 p(v, g);
    parallelReduce(0, v.length(), p);
    return wrap(p.s);
    }

    /*** R
    a <- 1:10
    g <- c(rep(0,5),rep(1,5))


    bb <- lapply(1:10000,function(x)sg5(a,g))
    cc<-do.call("rbind",bb)
    unique(cc)
    */

    与我的其他尝试相比,此代码在其他代码所做的相同情况下没有产生奇怪的结果。不是很放心。

    关于r - 多次调用同一个 Rcpp 函数时返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318419/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com