2014-09-09 6 views
0

각 사이트에서 이벤트를 처리해야하는 "사이트"(m)의 수가 있습니다 (데이터 청크는 모두 사용 가능). 각 이벤트 (그 중 n 개)는 처리를 위해 각 사이트로 전송됩니다. 그래서 당신은 nxm 작업이 있다고 생각할 수 있습니다. 처리 순서는 중요하지 않으며 한 번에 하나의 사이트에서만 여러 이벤트를 처리 할 수 ​​없습니다 (Task (m, x)는 Task (m, y)와 병렬로 실행할 수 없습니다)종속성과 병행하여 여러 작업 실행

"에 대한 OMP 평행"그러나 모든 사이트는 각 이벤트에 대해 동일한 복잡성을 가지고 있지, 이벤트

이 제대로 작동
for(...event...) 
#pragma omp parallel for 
    for(...site...) 
     site.process(event) 

에 루프에 대한 일반에 중첩 사이트에. 즉 모든 사이트는 다음 이벤트로 이동하기 전에 가장 느린 사이트를 기다려야합니다. 직원들이 다음 행사로 이동할 수 있도록 허용하면 2 배를 절약 할 수 있다고 추측합니다.

이것을 구현하는 가장 좋은 방법은 무엇입니까? 나는 C++을 사용하고 있습니다. TBB Flow Graph 또는 여러 개의 파이프 라인을 조사 중입니다 ...

각 "이벤트"는 디스크에서 읽어야하고, 약간의 메모리를 차지한다는 점이 하나 더 고려해야합니다. 아직 중요하지는 않지만, 한 번에 시스템에 이벤트를 거의 갖지 않거나 제한하려고합니다. 현재 구현에서 나는 단지 하나 (플러스 부부가 백그라운드에서 준비)를 가지고 있습니다 고마워

+0

종속성을 언급하지 않았습니다. 사이트 A는 사이트 B가 시작되기 전에 모든 작업을 완료 할 수 있습니까? – NiRR

+0

예. 어쩌면 의존성이 최고의 단어는 아닙니다. 병렬화에 한도 ...? 그래, 각 사이트에서 모든 이벤트를 처리 한 다음 다음 사이트로 이동할 수 있습니다. 이것은 2 for 루프의 순서를 뒤집는 것입니다 (내부를 평행선으로 남겨 둡니다). 그러나 모든 이벤트를 m 번 준비 (읽기)하는 오버 헤드로 인해이 솔루션에 미친 것은 아닙니다. – user2232888

+0

이 질문에 대한 답변이 필요합니까? – Anton

답변

0

각 측면의 처리 된 이벤트 (m * n bool 매트릭스)와 이벤트를 추적하는 관리자 프로세스를 사용합니다. 현재 "사용 중"입니다.

모든 사이트는 "임의"이벤트로 시작합니다. 관리자는 사이트를 탐색하여 현재 이벤트를 완료했는지 확인하고 가능한 경우 새 이벤트를 할당합니다.

C++ 11은 이러한 작업을 위해 std::async을 제공합니다.

각 프로세스 호출은 비동기식으로 처리되며 해당 미래 요소를 순환하여 완료되었는지 (wait_for) 확인할 수 있습니다.

관련 문제