使用Cilk数组表示法和STL向量

时间:2015-10-21 15:43:03

标签: c++ vector stl cilk-plus

我正在学习使用C ++ Plus扩展到C ++(在gcc上)的并行编程。我读过的最简单的重构之一是使用Cilk数组表示法,即使用它执行与顺序无关的向量运算。

即:c[:] = a[:] + b[:]

而不是:for (unsigned i = 0; i < a.size(); ++i) c[i] = a[i] + b[i];

我使用std::vector对象而非数组大量使用大量代码。是否可以将此概念与std::vector

一起使用

考虑abcstd::vector<double>等长,我尝试了这些并没有成功:

1

c[:] = a[:] + b[:]

2

double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[:] = aArr[:] + bArr[:]

两者都返回

  

在指针或记录中使用数组表示法所需的start-index和length字段

我知道方法#2会指向没有长度信息的向量,但有没有解决方法?

编辑:

优选有效的解决方案。例如,可以定义一个数组并使用std::copy将值从向量复制到数组,使用Cilk数组表示法执行加法,然后将值复制回向量。这可能比仅仅进行原始元素添加更昂贵。

1 个答案:

答案 0 :(得分:0)

这可能不是最好/最优雅的答案(如果有的话请发布备选方案),但似乎可以使用索引开始/长度规范的上述方法#2。像这样:

double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[0:c.size()] = aArr[0:c.size()] + bArr[0:c.size()]

当然,我需要注意矢量长度匹配,但它编译,到目前为止,似乎返回相同的答案。