2015-01-30 3 views
1

내 프로그램을 병렬 프로그램으로 변환하는 방법을 생각하는 데 어려움을 겪고 있습니다. 기본적으로 데이터 집합 (객체의 벡터)이 있고 각 클러스터에는 반복자 벡터가 있고 각 반복자는 데이터 집합의 원래 위치를 가리키는 클러스터 그룹을 추출합니다.반복자를 사용하여 C++ 프로그램을 Boost MPI 병렬 프로그램으로 변환

내가하고 싶은 일은 클러스터를 병렬로 만드는 프로세스를 만든 다음 모든 클러스터를 주 스레드로 다시 보냅니다. 문제는 부스트를 사용하여 모든 것을 직렬화하고 MPI를 통해 보내고 iterators를 직렬화하지 않는다는 것입니다. 반복자 대신 데이터 세트에 포인터를 사용하는 것만으로 생각했지만 클러스터를 주 스레드로 다시 보낼 때 주 스레드가 새로 만든 개체에 대한 모든 포인터를 데이터 세트를 가리 키도록해야합니다. 벡터 대신 (그리고 오래된 개체를 삭제하십시오), 그리고 나는 정말 좋은 해결책이라고 생각하지 않습니다. 그리고 나는 이것을 너무 빨리하는 방법을 생각할 수 없습니다.

그건 단지 첫 번째 부분입니다. 그 후에 다시 클러스터에 스레드를 보내야만 다른 계산을 수행 할 수 있으므로 클러스터를 수집하는 프로세스가 너무 느려서는 안됩니다.

감사합니다.

+0

OpenMP가 아닌 MPI를 사용 하시겠습니까? 단일 멀티 코어 컴퓨터에서 여러 스레드를 사용하거나 여러 컴퓨터에서 여러 프로세스를 함께 연결하고 싶습니까? –

+0

오랫동안 복용 해 주셔서 유감스럽게 생각합니다. 이메일로 알림을받을 예정이라고 생각했습니다. 여러 대의 컴퓨터가있는 MPI입니다. 그것이 프로젝트를 위해 최상인지 확실하지 않지만, 슬프게도 나는 지금 그것에 충실해야한다. 지금 문제를 해결했지만 감사합니다! – Rafael

답변

0

나는 언젠가 해결책을 찾았으며 그 대답은 정말 간단했습니다. 문제는 파티션에 클러스터 벡터가 있고 클러스터에 데이터 세트 개체를 가리키는 포인터가있는 벡터가 있으므로 다른 프로세서에 파티션을 보낼 수 없습니다. 해결책은 정수 배열로 파티션을 표현하는 또 다른 간단한 방법을 간단하게 만드는 것이 었습니다. 이를 위해 데이터 세트의 크기가있는 int 배열을 만들고 배열의 각 위치에 속한 클러스터의 인덱스를 넣습니다. 따라서 오브젝트 10이 파티션의 클러스터 배열에있는 인덱스 3의 클러스터에 속하면 위치 10에 3을 넣습니다. 이제 데이터 세트와이 배열을 보내고 필요한 경우 다른 쪽에서 클러스터를 다시 작성합니다 (가능한 경우 그 이유는 각 객체가 하나의 클러스터에만 있기 때문입니다.)

이 솔루션은 분명합니다 (이전에는 생각하지 못했던 방법이 확실하지 않음).이 솔루션이 다른 사람들에게 도움이 될지 의심 스럽지만 누군가 다른 사람이 다른 사람에게 데이터를 나타낼 수 있음을 알게 될 수도 있습니다. 직렬화가 작동하지 않을 때 MPI를 통해 보내는 단순한 방법.

관련 문제