mardi 25 octobre 2016

OpenMP 2.0 and Access violation reading location 0xFFFFFFFFFFFFFFFF

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