2

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

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

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

我有一个大量使用std::vector对象而不是数组的大型代码。是否可以将这个概念与std::vector?

考虑到a,bcstd::vector<double>长度相等,我尝试了这些但没有成功:

1.

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

2.

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

两者都返回

在指针或记录中使用数组表示法所需的起始索引和长度字段

我知道方法 #2 使指针指向没有长度信息的向量,但是有什么解决方法吗?

编辑:

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

4

1 回答 1

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()]

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

于 2015-10-21T18:18:32.337 回答