2014-05-23 6 views
0

공유 메모리 메소드를 사용하여 병렬로 실행할 수있는 C++ 코드가 있습니다. 코드를 PETSc에 연결하면 PETSc는 병렬로 코드를 실행할 수 있지만 분산 메모리 메소드로 실행할 수 있습니다. 병렬로 코드 (C++ + PETSc)를 실행하면 모든 프로세서가 동일한 작업을 반복하는 것으로 보입니다. 예를 들어, 프로세서 수가 4라면 경계 조건과 초기 조건을 4 번 읽거나 printf 명령을 사용하면 무언가가 4 번 인쇄됩니다. 따라서 작업이 프로세서간에 분산되지 않고 모든 프로세서가 일부 작업을 수행하는 대신 전체 작업을 수행한다는 의미입니다. 이 문제를 해결하기 위해 누구나 같은 경험을하고 있으며 당신의 제안은 무엇입니까? 예를 들어 , 당신이 그 코드를 한 번 읽는 대신에 두 번 메쉬를 읽고 볼 수 아래 :MPI를 사용하여 프로세서간에 작업을 배포하지만 모든 프로세서가 일부 작업 만 수행하는 대신 전체 작업 수행

읽기 메쉬 파일 Mesh_cavity2d.txt :

메쉬 파일 Mesh_cavity2d.txt을 읽는

나 :

답변

2

이 동작은 일반적으로 두 가지 중 하나를 나타냅니다. 출력 (및 기타 기능)을 한 계급으로 제한하는 것을 잊어 버리는 경우도 있습니다. 이 작업을 수행하는 쉬운 방법은 순위 번호를 얻을 수 MPI_Comm_rank을 사용하는 것입니다, 그리고 브래킷

if (rank==0) 
{ 
    // I/O here 
} 

의 모든 I/O 및 기타 작업은 또한 서로 통신하기 위해 계급을 얻는 문제로 실행 할 수있다. 필자는 잘못된 라이브러리에서 MPI가 아닌 프로그램을 실행하는 데 사용되는 몇 가지 원인을 발견했습니다.

+0

제임스 감사합니다. 그렇다면 내가 가진 모든 파일에 루프를 정의해야한다는 것을 의미합니까? 내 코드는 거의 50 개의 다른 헤더와 소스 파일로 구성되어 있습니다. (모두 rank = 0이면) 모두 정의해야합니까? – Nazi

+0

나치, if (rank == 0) 브라케팅이 포함 된 현재 인쇄 명령문 대신 래퍼 함수를 ​​사용할 수 있습니다. 기존 함수 호출을 쉽게 찾아서 바꿀 수 있도록 코드가 형식화되어 있으면 (cscope가 도움이 될 수 있음), 이것은 그렇게 큰 작업이 아닙니다. –