我在C ++中对for_each
的并行版本进行了大量搜索。我发现以下一段代码与here中的for_each
并列:
template<class T, class Function>
void parallel_for_each(std::vector< T> & obj, Function f)
{
int size = obj.size();
#pragma omp parallel for firstprivate(f) shared(obj)
for (int i = 0; i < size; i++)
{
f(obj[i]);
}
}
这是我的一段代码:
class A;
typedef std::vector <A> vec_A;
typedef std::vector <vec_A> vec_2D_A;
vec_2D_A a2d;
...
//serial
BOOST_FOREACH(vec_A& av, a2d)
{
for_each(av.begin(), av.end(), boost::bind(detect_Type, _1, CGAL, *this));
}
// parallel (segfault here!)
BOOST_FOREACH(vec_A& av, a2d)
{
parallel_for_each(av, boost::bind(detect_Type, _1, ALL, *this));
}
...
类A
是一个特定点的类。每个成员都有一个与其坐标和其他成员变量相对应的变量。
函数detect_type
正在修改av
的成员。
vec_pnt
内的所有成员彼此独立,但我仍然收到段错误。
修改:
这里是更多代码段。 detect_type负责使用最近邻搜索和XfieldPlus类本身的帮助来查找A的每个对象的类型。
void detect_Type(A& PNT, const NNSerach NNType, const xFieldPlus& lst)
{
switch (NNType)
{
case 0:
{
Nvertex = ANN_nearest(tip, lst); // It is NOT thread safe.
}
break;
case 1:
{
Nvertex = BOOST_nearest(tip, lst);
}
break;
case 2: //we use CGAL
{
Nvertex = CGAL_nearest(tip, lst);
}
break;
default:
std::cout << "Unknown NN-Serach" << std::endl;
break;
}
....
for(Entity::edgeIterator edgIter = f.beginEdge(); edgIter!= f.endEdge(); ++edgIter)
{
mesh::Edge edg = *edgIter;
if (edg != ed)
{
if (lst.getVal(edg.vertex(0)) * lst.getVal(edg.vertex(1)) < 0.0 )
{
PNT._type = ON_EDGE_NEED;
return;
}
}
}
...
}