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



我正在学习使用Cilk 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 ?

考虑a, bc是相同长度的std::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将值从vector复制到数组,使用Cilk数组表示法执行加法,然后将值复制回vector。这可能比只做原始的元素加法更昂贵。

这可能不是最好/最优雅的答案(如果有的话请发布替代方案),但似乎确实可以使用上述方法#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()]

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

相关内容

  • 没有找到相关文章

最新更新