我尝试将此部分代码并行,但由于使用了不等式!=
而出现错误。
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]);
答案 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