c++ - iter - vector begin type



병렬 반복자 (4)

OpenMP 병렬 루프는 이터레이터와 잘 작동하지 않습니다. 그래프 클래스에서 인덱싱 메커니즘 ( operator[] 을 구현하는 것이 좋습니다.

OpenMP 3.0 이터레이터 지원을 사용하려면 무작위 액세스 반복기가 있는지 확인하십시오. 이를 노드 또는 에지에 대한 포인터로 구현하는 것이 가장 간단한 방법입니다.

https://src-bin.com

병렬 코드 (OpenMP 사용)에서 사용할 C ++ 데이터 구조 (그래프 용)를 설계하고 있습니다.

모든 요소 (노드)를 반복 할 수있는 메서드가 필요하다고 가정 해 보겠습니다. 물론이 반복은 병렬화 될 것입니다.

이를 위해 반복자를 사용할 수 있습니까? 병렬 액세스를 가능하게하는 반복기는 어떻게 만들어야합니까? 이 경우 반복자를 사용하거나 사용하지 말라고 조언 하시겠습니까?


Answer #1

이것은 리더 / 라이터 문제의 변형입니다.

그 구조가 가변적인지 아닌지에 달려 있습니다. 그렇지 않다면, 당신은 나가서 원하는만큼 평행하게 읽으십시오.

그러나 변경 될 수 있다면 반복자는 구조 변경에 충돌 할 가능성이 큽니다. 예를 들어, 이터레이터는 현재 삭제되고있는 요소에 도착할 수 있습니다. 한 가지 해결책은 각 반복자에 대해 구조체의 읽기 전용 불변 복제본을 만드는 것이지만 반복기를 만든 후에 구조체에 대한 모든 변경 사항을 반복자가 등록하지 않습니다. 두 번째 해결 방법은 copy-on-write 구현을 작성하는 것입니다. 그러면 구조에 대한 모든 쓰기가 새로운 객체를 생성하고 현재 실행중인 반복자가 이전 객체에서 작동합니다.

해당 구조에 대한 어떤 쓰기가 프로그램에 어떤 의미인지를 알고리즘 방식으로 결정한 다음 적절하게 읽기 / 쓰기 잠금을 구현해야합니다.


Answer #2

나무 인 경우, "반복자"보다 Euler Tour Traversals에 대한 스캔의 측면에서 더 많이 생각하고 싶을 것입니다. http://en.wikipedia.org/wiki/Euler_tour_technique

나는 Stepanov의 책을 나 앞에서 가지고 있었으면 좋겠다. 나는 그 사람이 잠시 그것에 만지는 것을 기억한다.






openmp