首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于RcppParallel的矢量并行加法

基于RcppParallel的矢量并行加法
EN

Stack Overflow用户
提问于 2018-11-09 21:31:26
回答 1查看 110关注 0票数 4

我正在尝试使用RcppParallel并行处理(大型)向量的添加。这就是我想出来的。

代码语言:javascript
复制
// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
#include <Rcpp.h>
#include <assert.h> 
using namespace RcppParallel;
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector directVectorAddition(NumericVector first, NumericVector second) {
    assert (first.length() == second.length());
    NumericVector results(first.length());
    results = first + second;
    return results;
}

// [[Rcpp::export]]
NumericVector loopVectorAddition(NumericVector first, NumericVector second) {
    assert (first.length() == second.length());
    NumericVector results(first.length());
    for(unsigned i = 0; i != first.length(); i++)
        results[i] = first[i] + second[i];
    return results;
}

struct VectorAddition : public Worker
{
    const RVector<double> first, second;
    RVector<double> results;
    VectorAddition(const NumericVector one, const NumericVector two, NumericVector three) : first(one), second(two), results(three) {}

    void operator()(std::size_t a1, std::size_t a2) {
        std::transform(first.begin() + a1, first.begin() + a2,
                       second.begin() + a1,
                       results.begin() + a1,
                       [](double i, double j) {return i + j;});
    }
};


// [[Rcpp::export]]
NumericVector parallelVectorAddition(NumericVector first, NumericVector second) {
    assert (first.length() == second.length());
    NumericVector results(first.length());
    VectorAddition myVectorAddition(first, second, results);
    parallelFor(0, first.length(), myVectorAddition);
    return results;
}

这似乎是可行的,但并没有加快速度(至少在4核机器上是不行的)。

代码语言:javascript
复制
> v1 <- 1:1000000
> v2 <- 1000000:1
> all(directVectorAddition(v1, v2) == loopVectorAddition(v1, v2))
[1] TRUE
> all(directVectorAddition(v1, v2) == parallelVectorAddition(v1, v2))
[1] TRUE
> result <- benchmark(v1 + v2, directVectorAddition(v1, v2), loopVectorAddition(v1, v2), parallelVectorAddition(v1, v2), order="relative")
 > result[,1:4]
                            test replications elapsed relative
    1                        v1 + v2          100   0.206    1.000
    4 parallelVectorAddition(v1, v2)          100   0.993    4.820
    2   directVectorAddition(v1, v2)          100   1.015    4.927
    3     loopVectorAddition(v1, v2)          100   1.056    5.126

这能否更有效地执行?

提前谢谢你,

mce

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-09 21:41:41

)将其定义为Rcpp::NumericVector,但创建通过序列运算符创建的数据。这将创建整数值,因此您将强制将一个副本复制到所有函数上!

搞定

代码语言:javascript
复制
v1 <- as.double(1:1000000)
v2 <- as.double(1000000:1)

相反,在一台有许多核心的机器上(在工作中),我看到

代码语言:javascript
复制
R> result[,1:4]
                            test replications elapsed relative
4 parallelVectorAddition(v1, v2)          100   0.301    1.000
2   directVectorAddition(v1, v2)          100   0.424    1.409
1                        v1 + v2          100   0.436    1.449
3     loopVectorAddition(v1, v2)          100   0.736    2.445

这个例子仍然不那么令人印象深刻,因为相关的操作是“廉价的”,而并行方法需要分配内存、将数据复制到工作人员、再次收集等等pp。

但好消息是,您正确地编写了并行代码。这可不是个小任务。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53233512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档