I am trying to parallelize filling a vector using OpenMP V.2.0 (Why not using a recent version, ask visual studio ;) ).
shared_ptr<GroupManager> m_manager_ptr = std::make_shared< GroupManager>( m_manager);
std::vector<IntersectionStrategyONE> vec;
#pragma omp parallel
{
std::vector<IntersectionStrategyONE> vec_private;
#pragma omp for nowait firstprivate(m_manager_ptr) //fill vec_private in parallel
for (int i = 0; i < vectest.size(); ++i) // or use iterators in newer OpenMP, but I don't have access ;)
{
StlTriangle *i_triangle = vectest[i]->GetStlTriangle();
if ((GroupManager::GetGroup(i_triangle) != 0) && (m_manager_ptr->GetThickness(i_triangle) != 0))
{
//Checking if current triangle does intersect
if (_DoesIntersect(i_triangle))
{
//Saving the data on intersection in a newly created object inter, and saving it into the set of intersections
Intersection inter;
_FindIntersection(inter, i_triangle);
vec_private.push_back(inter);
}
}
}
#pragma omp critical
vec.insert(vec.end(), vec_private.begin(), vec_private.end());
}
FAILS In function GetThickness while getting GetStl():
unsigned char GroupManager::GetThickness(StlTriangle * ip_tri) const
{
if (m_thickness_info.size() == 0)
return 1;
TThicknessInfo::const_iterator it = m_thickness_info.find(ip_tri->GetStl()); // **FAILS HERE**
if (it == m_thickness_info.end())
// default thickness is 1
return 1;
return it->second->GetInfo(*ip_tri);
}
StlTriangle *i_triangle is constructed for each thread, Why does it fail?
Aucun commentaire:
Enregistrer un commentaire