2009-04-02 2 views
0

각 프로세스의 정수 배열의 내용을 출력하고 싶습니다. 문제는 경쟁 조건으로 인해 어지럽다.MPI : 한번에 stdout - 1 프로세스 잠그기?

가장 간단한 솔루션은 무엇입니까? 나는 디버그하고 싶지 않다. 정렬 알고리즘을 수행 중이므로 내용을 표시하고 싶습니다. 따라서 정렬 전후에 표시하는 것이 유용합니다.

나는 lock.c이 추가 :

#include <stdio.h> 
static int lock=0; //Don't use if timing execution 
void capture(int rank) { 
    while(lock!=0); 
    lock = 1; 
    printf("\nCaptured by %d\n", rank); 
} 
void release() { 
    lock = 0; 
} 

및 통화 캡처() 물건을 인쇄하기 전에, 다음 릴리스() 인쇄 후. 예, 세마포어와 같은 해킹입니다. 그러나 그것은 효과가 없다, 어떤 생각?

+0

"작동하지 않습니다"라고 말하면, 당신은 personnaly를 의미합니까? 다른 스레드의 출력이 섞여 있다는 뜻입니까? 이게 네가 말하는거야? –

+0

예, 경쟁 조건입니다. – syaz

답변

1

각 프로세스에는 고유 한 변수 사본이 있습니다. 따라서 공유되지 않으며 동기화에 사용할 수 없습니다.

+0

잠금은 정적으로 규정되므로 스레드간에 공유됩니다. –

+0

@OfekShilon하지만 MPI는 공유 메모리 시스템이 아니므로 스레드간에 공유 될 수 있지만 MPI * 프로세스 간에는 공유되지 않습니다 *. – Nathan

2

메시지 전달 인터페이스를 의미한다고 가정 할 때 가장 좋은 방법은 출력 문자열을 버퍼에 쓰고 순위 0 프로세스로 보내는 것입니다. 이 프로세스는 실제 작업을 수행하는 것이 아니라 출력 문자열을 필터링하고 출력하는 데 사용해야합니다.

실제 작업을 수행하는 다른 등급을 유지하십시오. 내가 각 순위에 지역이기 때문에 위의 솔루션이 효과가 있다고 생각하지 않습니다.

또한 메시지가 출력되기 전까지는 메시지를 사용하지 않고 정렬 작업을 수행 할 수 없기 때문에 개별 순위를 중지하지 않으려합니다.

각 순위 1에서 N으로 작업을하고 순위 0으로 문자열을 보냅니다. 문자열의 형식은 "NNN:SSSSSS"이고 N은 순위이고 S는 문자열입니다. 순위 0은 특정 메시지를 필터링하거나 다른 메시지를 다른 파일에 쓰고, 모든 작업 랭크가 종료되면이를 결합 (정렬) 할 수 있습니다. 이것은, 비효율적 물론

for(int i = 0; i < size; ++i) { 
    MPI_Barrier(MPI_COMM_WORLD); 
    if (i == rank) { 
     printf("..."); 
    } 
} 

하지만 수 있습니다 :

2

모든 프로세스 'STDOUTs를 수집 MPI를를 사용하는 가정하면,과 같이, 순서를 적용 할 MPI_Barrier()를 사용할 수 있습니다 모든 정보를 다시 0 순위로 보내 주려고하는 것보다 조금 간단합니다.

+0

감사합니다, Edric! 나는이 내 자신의 버전으로 거의 정확한 솔루션을했다 ...하지만 상황이 여전히 이 많은 감사 .. 구타지고 있었다() 때문에 장벽에 대한 호출이 없었습니다. –