2016-10-21 3 views
0

Ich frage mich, wie ich for Schleife unten auf sichere Weise parallelisieren kann. Ich fand eine mögliche Lösung wie this. Ich bin jedoch beschränkt auf OpenMP Version 2.0 und Boost Version 1.59.OpenMP v.2.0 oder Boost-Thread 1.59

Algorithmus Erläuterung:

Es iteriert alle meine Dreiecke auf, die innerhalb des Begrenzungsrahmens liegen, dann überprüft er Möglichkeit der Kreuzung (mit einem einzigartigen Dreieck) in _considerTriangle Funktion. Schließlich in der _considerTriangle, wenn ein Dreieck geschnitten wird, fügt es Dreieck zu einem Set-Container intersectedTri.

//Iterating through every triangle 
std::set<Triangle> intersectedTri; 
for(IntersectedTrianglesIterator it=tree.Begin_IteratorByBoundingBox(bbox_min,bbox_max);it!=tree.End_IteratorByBoundingBox(bbox_min,bbox_max);++it) 
      _ConsiderTriangle(it->GetTriangle()); 

Ich wundere mich, wie ich es sicher paralllise kann.

+0

Sie müssen weitere Informationen zu Ihrem Code angeben. Es ist völlig unklar, was die zugrunde liegenden Datenstrukturen sind ('tree'), wie teuer bestimmte Operationen sind (' IntersectedTrianglesIterator :: operator ++ 'vs' _ConsiderTriangle', 'GetTriangel'), welcher Zustand während einer Iteration geändert wird, ob 'IntersectedTrianglesIterator' ist ein Direktzugriffs-Iterator, .... Bitte geben Sie ein [mcve]. – Zulan

+0

BTW: OpenMP 2.0 ist mehr als ** 14 Jahre alt. Haben Sie ernsthaft keine neuere Version verfügbar? – Zulan

+0

Ich benutze Visual Studio, und wie Sie jetzt auch VS2015 keine neuere Version des OpenMP unterstützen wird. –

Antwort

0

Sie können eine beliebige Methode verwenden, solange Sie die Einfügung in intersectedTri synchronisieren.

// globals 
boost::mutex mut; 

// inside func 
boost::mutex::scoped_lock lock(mut); 
intersectedTri.insert(tri);