具有不等式的循环的并行化(openmp c ++)

时间:2017-11-19 20:00:52

标签: c++ openmp

我尝试将此部分代码并行,但由于使用了不等式!=而出现错误。

 double sum_sin = 0.0, sum_cos = 0.0;
            int count = 0;
    #pragma omp parallel for reduction(+ : count ,sum_sin,sum_cos)
            for (vector<int>::iterator it = box_neighbors[bx[i]].begin(); it != box_neighbors[bx[i]].end(); ++it)
                {
                for (vector<int>::iterator itp = box_particles[*it].begin(); itp != box_particles[*it].end(); ++itp)
                     {
                     if(dist(x[i], y[i], x[*itp], y[*itp], L) < R0_two)
                        {
                        sum_sin+= sin(theta[*itp]);
                        sum_cos+= cos(theta[*itp]);
                        count+=1;  //number of neighbours of i'th particle
                        }
                     }
                }
            sum_sin/= count;
            sum_cos/= count;

如何删除错误? 这是错误:

invalid controlling predicate
             for (vector<int>::iterator it = box_neighbors[bx[i]].begin(); it !=

我根据评论

编写了代码
           double sum_sin = 0.0, sum_cos = 0.0;
            int count = 0;
            #pragma omp parallel for reduction(+ : count ,sum_sin,sum_cos)
std::vector<int> v; 
for(std::size_t it=0; it<v.size(); ++it) 
            //for (vector<int>::iterator it = box_neighbors[bx[i]].begin(); it != box_neighbors[bx[i]].end(); ++it)
                {
for(std::size_t itp=0; itp<v.size(); ++itp) 
                //for (vector<int>::iterator itp = box_particles[*it].begin(); itp != box_particles[*it].end(); ++itp)
                     {
                     if(dist(x[i], y[i], x[*itp], y[*itp], L) < R0_two)
                        {
                        sum_sin+= sin(theta[*itp]);
                        sum_cos+= cos(theta[*itp]);
                        count+=1;  //number of neighbours of i'th particle
                        }
                     }
                }

但是出现了新的错误:

    error: for statement expected before ‘std’
     std::vector<int> v; 
     ^
 error: invalid type argument of unary ‘*’ (have ‘std::size_t {aka long unsigned int}’)
                          if(dist(x[i], y[i], x[*itp], y[*itp], L) < R0_two)
                                                 ^
  error: invalid type argument of unary ‘*’ (have ‘std::size_t {aka long unsigned int}’)
                          if(dist(x[i], y[i], x[*itp], y[*itp], L) < R0_two)
                                                          ^
    error: invalid type argument of unary ‘*’ (have ‘std::size_t {aka long unsigned int}’)
                             sum_sin+= sin(theta[*itp]);
                                                  ^
   error: invalid type argument of unary ‘*’ (have ‘std::size_t {aka long unsigned int}’)
                             sum_cos+= cos(theta[*itp]);

2 个答案:

答案 0 :(得分:1)

只需从

更改循环条件
it != box_neighbors[bx[i]].end()

it < box_neighbors[bx[i]].end()

OpenMP确实支持随机访问迭代器作为3.0版以来的循环变量。但是,您仍然必须遵守规范循环形式,并且不支持!=

答案 1 :(得分:0)

只有第一个log := Log{} c := len(fields) if c > 0 { log.Field1 = fields[0] } if c > 1 { log.Field2, _ = strconv.ParseUint(fields[1], 0, 64) } if c > 3 { log.Field3 = fields[2] } //... 使用迭代器,位于for loop下方,才会出现问题。使用OpenMP时,通常只使用带计数器的规范循环更安全。因此,所需的最小变化是:

omp pragma