Openmp和std :: vector的缩减?

时间:2017-04-02 13:04:10

标签: c++ vector parallel-processing openmp reduction

我想让这段代码并行:

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问题中,评论部分提出了相同的方法。

我有两个问题:

  1. 我在编译时不知道m,从这两个例子看来似乎是必需的。是这样吗?或者如果我可以在这种情况下使用它,我还需要在以下命令?中用#pragma omp parallel for reduction(+:res[:?])替换它? mn
  2. for的索引是相对于indexesvals而不是res是否相关,特别是考虑到reduction已完成后一个?
  3. 但是,如果是这样,我该如何解决这个问题?

1 个答案:

答案 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)只要您只阅读indexesvals,就没有问题。