使用 Cilk 数组表示法和 STL 向量
Using Cilk array notation and STL vectors
我正在学习使用 C++ 的 Cilk Plus 扩展(在 gcc 上)进行并行编程。我读过的最简单的重构之一是使用 Cilk 数组表示法,即使用它执行与顺序无关的向量运算。
即:c[:] = a[:] + b[:]
而不是:for (unsigned i = 0; i < a.size(); ++i) c[i] = a[i] + b[i];
我有大量代码大量使用 std::vector
对象而不是数组。是否可以将此概念与 std::vector
一起使用?
考虑到 a
、b
和 c
是等长的 std::vector<double>
,我尝试了这些但没有成功:
1.
c[:] = a[:] + b[:]
2.
double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[:] = aArr[:] + bArr[:]
两者都return
start-index and length fields necessary for using array notations in pointers or records
我知道方法 #2 会在没有长度信息的情况下创建一个指向向量的指针,但是有什么解决方法吗?
编辑:
首选有效的解决方案。例如,可以定义一个数组并使用 std::copy
将值从向量复制到数组,使用 Cilk 数组符号执行加法,然后将值复制回向量。这可能比仅进行原始的逐元素加法成本更高。
这可能不是 best/most-elegant 答案(如果有,请 post 替代),但使用索引 start/length 的上述方法 #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()]
当然,我需要注意向量长度是否匹配,但它编译了,到目前为止,似乎 return 相同的答案。
我正在学习使用 C++ 的 Cilk Plus 扩展(在 gcc 上)进行并行编程。我读过的最简单的重构之一是使用 Cilk 数组表示法,即使用它执行与顺序无关的向量运算。
即:c[:] = a[:] + b[:]
而不是:for (unsigned i = 0; i < a.size(); ++i) c[i] = a[i] + b[i];
我有大量代码大量使用 std::vector
对象而不是数组。是否可以将此概念与 std::vector
一起使用?
考虑到 a
、b
和 c
是等长的 std::vector<double>
,我尝试了这些但没有成功:
1.
c[:] = a[:] + b[:]
2.
double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[:] = aArr[:] + bArr[:]
两者都return
start-index and length fields necessary for using array notations in pointers or records
我知道方法 #2 会在没有长度信息的情况下创建一个指向向量的指针,但是有什么解决方法吗?
编辑:
首选有效的解决方案。例如,可以定义一个数组并使用 std::copy
将值从向量复制到数组,使用 Cilk 数组符号执行加法,然后将值复制回向量。这可能比仅进行原始的逐元素加法成本更高。
这可能不是 best/most-elegant 答案(如果有,请 post 替代),但使用索引 start/length 的上述方法 #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()]
当然,我需要注意向量长度是否匹配,但它编译了,到目前为止,似乎 return 相同的答案。