하나의 메인 어레이에 특정 데이터를 추가하는 것을 목적으로하는 프로그램이 있습니다. 난수 테스트 passesTest(randomNumber)
은 매초마다 수백만 번 수행되며, 때로는 테스트가 통과되고 난수가 배열의 끝으로 푸시됩니다. 그래서 대부분의 경우 계산은 계속 진행되는 동안 배열이 그곳에 그냥 앉아 있습니다.MPI_Allgather가 코드 병목 현상입니까? 어떻게 수정합니까?
나는 무작위 수 테스트를 수행하는 1000 개의 프로세서가 큰 속도 향상이 될 것이라고 생각했기 때문에이 절차를 MPI와 병렬 처리하기로 결정했으며 메모리 쓰기가 매우 드물기 때문에 MPI가 작업에 적합해야합니다. 많은 당황 스럽지만, 내 프로그램은 mpirun -np 1
으로 가장 빠르며 내가 추가 한 각 프로세스에서 상당히 느려집니다. passesTest(randomNumber)
이 포함되어 내 while
루프의 끝에서
MPI::COMM_WORLD.Allgather()
있습니다. 플래그가
true
인 경우
Allgather()
을 실제로 수행하여이 데이터를 각 프로세스의 로컬 사본에 푸시합니다. 테스트가 거의 통과되지 않기 때문에이 두 번째
Allgather()
도 매우 드물게 수행됩니다.
그래서 나는 병목 현상이 각 MPI 프로세스의 모든 플래그를 수집하여 새로운 데이터가 있는지 확인하고 있습니다. 각 난수의 테스트가 빨리 수행되므로 여러 프로세스에서 데이터를 수집하는 오버 헤드로 인해 초당 수십억 개의 while 루프가 현저히 줄어들 었다고 가정합니다. 이것은 좋은 추측입니까? 저는 MPI를 처음 사용하기 때문에 Allgather()
과 어떤 종류의 시간대가 연관되어 있는지 알지 못합니다.
이것이 이유 인 경우 테스트 통과시 다른 프로세스와 어떻게 "상호 작용"할 수 있습니까? 이것은 내가 정말로하고 싶은 모든 것입니다. 즉, 임의의 숫자가 테스트를 통과하면 다른 모든 프로세스에 메시지를 보내 자신이 수행중인 작업을 중단하고 그 번호를 배열에 추가합니다.
아마도 데이터를 배열에 푸시하는 순서는 중요하지 않으므로 실제 테스트에서 새 데이터에 의존하지 않으려 고하는 이유는 무엇입니까? 로컬에서 모든 것을 계산하고 마지막에 많은 데이터 덩어리를 푸십시오 (또는 반복적으로 1 억 개 정도의 반복 또는 매회마다). – Voo
음, 실제로 실제 테스트에서 새 데이터를 사용합니다. (이 질문에 대해 모든 것을 단순화했습니다.) – Nick
최적화에 대한 질문에서 필요한 종속성을 제거하는 것이 실제로 유용하지 않을 수 있습니다.우리가 말할 수 있기 전에 데이터 의존성의 정확한 형태를 설명해야합니다. – Voo