我想让这段代码并行:
std::vector<float> res(n,0);
std::vector<float> vals(m);
std::vector<float> indexes(m);
// fill indexes with values in range [0,n)
// fill vals and indexes
for(size_t i=0; i<m; i++){
res[indexes[i]] += //something using vas[i];
}
在this文章中建议使用:
#pragma omp parallel for reduction(+:myArray[:6])
在this问题中,评论部分提出了相同的方法。
我有两个问题:
m
,从这两个例子看来似乎是必需的。是这样吗?或者如果我可以在这种情况下使用它,我还需要在以下命令?
中用#pragma omp parallel for reduction(+:res[:?])
替换它? m
或n
?for
的索引是相对于indexes
和vals
而不是res
是否相关,特别是考虑到reduction
已完成后一个?但是,如果是这样,我该如何解决这个问题?
答案 0 :(得分:8)
对于特定类型的C ++向量执行用户声明的减少是相当直接的:
#include <algorithm>
#include <vector>
#pragma omp declare reduction(vec_float_plus : std::vector<float> : \
std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<float>())) \
initializer(omp_priv = omp_orig)
std::vector<float> res(n,0);
#pragma omp parallel for reduction(vec_float_plus : res)
for(size_t i=0; i<m; i++){
res[...] += ...;
}
1a)不需要在编译时知道m
。
1b)你不能在std::vector
上使用数组部分缩减,因为它们不是数组(并且std::vector::data
不是标识符)。如果可能,您必须使用n
,因为这是数组部分中的元素数。
2)只要您只阅读indexes
和vals
,就没有问题。