2013-06-21 3 views
1

포트란의 MPI_BCAST에 문제가 있습니다. MPI_CART_CREATE ('COMM_NEW')를 사용하여 새로운 커뮤니케이터를 생성합니다. 이전 커뮤니케이터 (예 : MPI_COMM_WORLD)를 사용하여 루트에서 데이터를 브로드 캐스팅하면 정상적으로 작동합니다.MPI_CART_CREATE와 함께 MPI_BCAST를 사용할 때의 문제

[compute-4-15.local:15298] *** An error occurred in MPI_Bcast 
[compute-4-15.local:15298] *** on communicator MPI_COMM_WORLD 
[compute-4-15.local:15298] *** MPI_ERR_COMM: invalid communicator 
[compute-4-15.local:15298] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) 

그것은 COMM_NEW에 포함 된 프로세서, 또한 위의 오류의 결과를 얻는다는 문제가 다른 프로세서 생각 : 내가 방금 만든 새로운 의사 소통을 사용하는 경우, 그것은 오류를 제공합니다 COMM_NEW에 포함되지 않지만 MPI_COMM_WORLD에 존재합니다. 어떤 도움이라도 대단히 감사하겠습니다. COMM_NEW의 프로세서 수가 총 프로세서 수보다 적기 때문입니다. 그렇다면 어떻게 합계보다 적은 프로세서 세트에서 방송을 할 수 있습니까? 감사. 내 샘플 코드는 다음과 같습니다

!PROGRAM TO BROADCAST THE DATA FROM ROOT TO DEST PROCESSORS 
PROGRAM MAIN 
IMPLICIT NONE 
INCLUDE 'mpif.h' 
!____________________________________________________________________________________ 
!-------------------------------DECLARE VARIABLES------------------------------------ 
INTEGER :: ERROR, RANK, NPROCS, I 
INTEGER :: SOURCE, TAG, COUNT, NDIMS, COMM_NEW 
INTEGER :: A(10), DIMS(1) 
LOGICAL :: PERIODS(1), REORDER 
!____________________________________________________________________________________ 
!-------------------------------DEFINE VARIABLES------------------------------------- 
SOURCE = 0; TAG = 1; COUNT = 10 
PERIODS(1) = .FALSE. 
REORDER = .FALSE. 
NDIMS = 1 
DIMS(1) = 6 
!____________________________________________________________________________________ 
!--------------------INITIALIZE MPI, DETERMINE SIZE AND RANK------------------------- 
CALL MPI_INIT(ERROR) 
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, NPROCS, ERROR) 
CALL MPI_COMM_RANK(MPI_COMM_WORLD, RANK, ERROR) 
! 
CALL MPI_CART_CREATE(MPI_COMM_WORLD, NDIMS, DIMS, PERIODS, REORDER, COMM_NEW, ERROR) 

IF(RANK==SOURCE)THEN 
DO I=1,10 
    A(I) = I 
END DO 
END IF 
!____________________________________________________________________________________ 
!----------------BROADCAST VECTOR A FROM ROOT TO DESTINATIONS------------------------ 

CALL MPI_BCAST(A,10,MPI_INTEGER,SOURCE,COMM_NEW,ERROR) 

!PRINT*, RANK 
!WRITE(*, "(10I5)") A 

CALL MPI_FINALIZE(ERROR) 

END PROGRAM 

답변

2

나는 MPI_COMM_WORLD에 BCAST에 대해 불평하기 때문에 당신이 당신의 질문의 상단에 줄 오류가 맨 아래에있는 코드와 일치하지 않는 생각하고 실제로하지 않습니다 귀하의 코드에서 하나를하십시오.

어쨌든 치수보다 많은 프로세스로 실행중인 경우 일부 프로세스는 COMM_NEW에 포함되지 않습니다. 대신 MPI_CART_CREATE에 대한 호출이 반환되면 토폴로지가있는 새 통신자 대신 COMM_NEW에 대해 MPI_COMM_NULL을 얻습니다. BAD를하기 전에 MPI_COMM_NULL 대신 진짜 의사 소통자가 있는지 확인하기 만하면됩니다 (또는 DIMS (1) 위의 모든 순위를 Bcast에 입력하지 않아도됩니다).

+1

+1. Open MPI는 잘못된 통신기 핸들과 관련된 모든 오류 메시지에서'MPI_COMM_WORLD'를 사용합니다. 내 대답을보십시오. –

+0

감사합니다. 나는 당신이 지적한대로 오류와 오류를 찾을 수있었습니다. 그것은 if 조건을 사용하여 COMM_NEW 내에서 MPI_BCAST를 호출 할 때 작동합니다. – user2510336

2

Wesley Bland의 답변에 대해 자세히 설명하려면 오류 메시지의 명백한 불일치를 명확히하기 위해 MPI_COMM_WORLD의 MPI 프로세스 수가 생성 된 데카르트 그리드의 프로세스 수보다 클 때 일부 프로세스는 새로운 데카르트 커뮤니케이터의 구성원이되지 않고 MPI_COMM_NULL - 결과적으로 유효하지 않은 통신자 핸들 - 집합 통신 작업 호출에는 유효한 내부 또는 내부 통신자 핸들이 필요합니다. 일괄 작업에서 유효하지 않은 통신자 핸들을 사용하여 지점 간 작업에서 허용 된 사용 방법 인 MPI_PROC_NULL과 달리 마지막 진술은 명확하지 않다. - TLY는 MPI 표준을 작성하는 대신, 사용되는 언어는 다음과 같습니다 MPI_COMM_NULL 이후

If comm is an intracommunicator, then ... If comm is an intercommunicator, then ...

는 없다 둘 인트라,도 간 의사 소통, 그것은 정의 행동의 두 가지의 카테고리에 속하지 않는 및 따라서 오류 조건이 발생합니다.

일부 컨텍스트 (즉, 유효한 통신기)에서 통신 오류가 발생해야하므로 Open MPI는 오류 처리기를 호출 할 때 MPI_COMM_WORLD을 대신 사용하므로 오류 메시지에 "*** on communicator MPI_COMM_WORLD"이 표시됩니다. MPI_Bcast이 구현 된 곳은 ompi/mpi/c/bcast.c에서 관련 코드 섹션입니다 :

if (ompi_comm_invalid(comm)) { 
    return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM, 
           FUNC_NAME); 
} 
... 
if (MPI_IN_PLACE == buffer) { 
    return OMPI_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME); 
} 

코드는 첫 번째 체크 내부 오류 핸들러를 트리거합니다. 다른 모든 오류 검사에서 대신 comm이 사용되며 (올바른 통신기 핸들로 판단되기 때문에) 오류 메시지는 "*** on communicator MPI COMMUNICATOR 5 SPLIT FROM 0"과 같은 상태로 표시됩니다.

+0

정보를 제공해 주셔서 감사합니다. – user2510336

관련 문제