MPI_Barrier()에 아무런 문제가 없습니다.
Jens mentioned으로 예상되는 결과가 표시되지 않는 이유는 stdout이 각 프로세스에서 버퍼링되기 때문입니다. 여러 프로세스의 인쇄물이 호출 프로세스에 순서대로 표시된다는 보장은 없습니다. (각 프로세스에서 stdout을 주 프로세스로 전송하여 실시간으로 인쇄 할 경우 많은 불필요한 통신이 발생합니다!)
장벽이 작동한다고 확신하려면 다음과 같이 작성하십시오. 파일 대신. 하나의 파일에 여러 개의 프로세스를 쓰게되면 복잡한 일이 생길 수 있으므로 각 파일을 하나의 파일에 쓰게 한 다음 장벽이 끝나면 쓰는 파일을 서로 바꿀 수 있습니다. 예를 들어 :
Proc-0 Proc-1
| |
f0.write(..) f1.write(...)
| |
x ~~ barrier ~~ x
| |
f1.write(..) f0.write(...)
| |
END END
샘플 구현 :
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
char filename[20];
int rank, size;
FILE *fp;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank < 2) { /* proc 0 and 1 only */
sprintf(filename, "file_%d.out", rank);
fp = fopen(filename, "w");
fprintf(fp, "P%d: before Barrier\n", rank);
fclose(fp);
}
MPI_Barrier(MPI_COMM_WORLD);
if (rank < 2) { /* proc 0 and 1 only */
sprintf(filename, "file_%d.out", (rank==0)?1:0);
fp = fopen(filename, "a");
fprintf(fp, "P%d: after Barrier\n", rank);
fclose(fp);
}
MPI_Finalize();
return 0;
}
코드를 실행 한 후, 다음과 같은 결과를 얻어야한다 : 모든 파일에 대해
[[email protected]]$ cat file_0.out
P0: before Barrier
P1: after Barrier
[[email protected]]$ cat file_1.out
P1: before Barrier
P0: after Barrier
은 "후 장벽"문은 것 항상 나중에 나타납니다.
클럭 동기화가 보장되지 않으면 MPI 프로세스가 다른 노드에서 실행되는 경우 타임 스탬프를 사용하는 것이 이상적이지 않을 수 있습니다. –
@Shawn : MPI_Wtime()이 있습니다. – suszterpatt
@suszterpatt :'MPI_Wtime()'은 대개 글로벌/동기화 된 시계가 아닙니다! (단지'MPI_WTIME_IS_GLOBAL'이 정의되고 참인 경우입니다) – Zulan