2013-03-11 2 views
1

마스터 프로세스에서만 수행 할 수있는 작업을 수행해야합니다. 노예들은 아무 것도 할 수 없지만 주인이 끝날 때까지 기다립니다. 그래서 저는 (. 내가 코멘트가 내가 뭐하는 거지 설명에서 충분히 명확 바랍니다 내가 가장 루틴을 포장, 그래서 힘든 시간이 실제 MPI 코드로 오는 것, 의사) 다음했다MPI_Bcast를 사용하여 동기화 할 수 있습니까?

def routine(): 

    if not isMaster(): 
     # I am a slave. I just sit here, waiting for the master to finish. 
     # wait for a string from the master explaining the state 
     string = MPI_Bcast("whatever", 0) 
     return (string == "SUCCESS") 

    <master does its long running business> 

    string = MPI_Bcast("SUCCESS", 0) # tell the slaves it worked fine. 

    return True 

합니까 이 작품, 아니면 내가 방송을 오용 하는가?

def routine(): 

    if not isMaster(): 
     # I am a slave. I just sit here, waiting for the master to finish. 
     # wait for a string from the master explaining the state 
     string = MPI_Bcast("whatever", 0) 
     return (string == "SUCCESS") 

    else: 
     <master does its long running business> 
     string = MPI_Bcast("SUCCESS", 0) # tell the slaves it worked fine. 

    return True 

것은 그럼 당신은 괜찮을 것 : 당신이 그 의사를 한 경우

+0

'MPI_Bcast'의 루트 랭크가'isMaster()'술어에서 사용 된 것과 일치하는지 확인하십시오. –

답변

2

. (물론 언어에 맞는 특정 MPI API를 가져야합니다.) 일반적으로 방송 또는 집단 작업의 경우, 커뮤니케이터의 각 순위는 동일한 수의 호출을 실행해야합니다. 이해를 위해, 동일한 소스 코드 라인상의 각 랭크에 대해 무조건 Bcast를 실행하는 방식으로 프로그램을 재구성하는 것이 유익 할 수있다.

def routine(): 
    status_code = UNKNOWN 
    if isMaster(): 
     #do stuff 
     status_code = OK 

    MPI_Bcast(&status_code, 0) 
    #check status_code on each rank 
+0

확인. 요점은 마스터와 슬레이브가 MPI_Bcast에 _the_same_call_을 명중하지 않는다면 문제가되지 않는다는 것입니다. 그들은 두 가지 다른 호출이 될 수 있지만, 그것이 동일하다는 것이 좋은 습관입니다. 나는 정확하게 이해합니까? –

+0

예, 정확히 제 요지입니다. – Zulan

+0

OP의 비 마스터 코드 끝 부분에'return' 문이 있기 때문에 'else :'를 추가 할 시점이 없습니다. 리팩토링 된 버전이 실제로 더 좋습니다. –

관련 문제