2016-10-21 2 views
0

안전한 방법으로 아래 루프를 어떻게 병렬 처리 할 수 ​​있는지 궁금합니다. this과 같은 가능한 해결책을 찾았습니다. 그러나 OpenMP 버전 2.0과 Boost 버전 1.59를 사용하도록 제한됩니다.OpenMP v.2.0 또는 부스트 스레드 1.59

알고리즘 설명 :

그것은 경계 상자 내에있는 내 모든 삼각형을 반복 처리는, 그것은 _considerTriangle 함수 (고유 삼각형) 교차로의 가능성을 확인합니다. 마지막으로 _considerThangle에서 삼각형이 교차되면 삼각형을 집합 컨테이너에 삽입합니다. 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()); 

나는 그것을 어떻게 안전하게 paralllise 수 있는지 궁금합니다.

+0

코드에 대한 추가 정보를 제공해야합니다. (IntersectionTrianglesIterator :: operator ++'_ConsiderTriangle'','GetTriangel'), 반복 중에 어떤 상태가 변경되는지,'IntersectedTrianglesIterator' ('IntersectedTrianglesIterator') 랜덤 액세스 반복자입니다 .... 플리 어스는 [mcve]를 제공합니다. – Zulan

+0

진술서 : OpenMP 2.0은 ** 14 년 ** 이전 버전입니다. 새 버전을 사용할 수 없습니까? – Zulan

+0

Visual Studio를 사용합니다. 이제 VS2015조차도 최신 버전의 OpenMP를 지원하지 않습니다. –

답변

0

intersectedTri에 삽입을 동기화하는 한 모든 방법을 사용할 수 있습니다.

// globals 
boost::mutex mut; 

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