2011-11-23 4 views
7

현재 그래프 이론 문제에 대한 MPI 코드를 작성 중입니다. 많은 노드에 각각 답변과 해당 답변의 길이가 포함될 수 있습니다. 모든 것을 마스터 노드로 되돌리려면 MPI_Gather를 사용하여 해답을 찾고 MPI_MINLOC 연산을 사용하여 MPI_Reduce를 시도하여 누가 가장 짧은 솔루션을 찾았는지 파악하려고합니다. 나는 다음과 같은 방식으로이 구조체의 로컬 복사본을 초기화하고있어 각 노드에서OpenMPI는 MINLOC을 사용하여 줄입니다.

struct minType 
{ 
    float len; 
    int index; 
}; 

: 길이를 저장하고 노드 ID가 (http://www.open-mpi.org/doc/v1.4/man3/MPI_Reduce.3.php 같은 수많은 사이트에 게재 예 당)으로 정의된다 지금 내 데이터 타입 : 나는 성공적으로 (I 메모리에 그들을 인쇄 한을 확인하기 위해) 모든 솔루션을 끌어 내리는 MPI_Gather 호출이 실행의 끝에서

int commRank; 
MPI_Comm_rank (MPI_COMM_WORLD, &commRank); 
minType solutionLen; 
solutionLen.len = 1e37; 
solutionLen.index = commRank; 

하고, 전화 :

MPI_Reduce (&solutionLen, &solutionLen, 1, MPI_FLOAT_INT, MPI_MINLOC, 0, MPI_COMM_WORLD); 
,536,913

  1. 데이터 소스
  2. 가 (단지 지정 루트 노드에 상당한)에 의해 전송 항목의
  3. 수 결과에 대한 목표입니다 : 63,210

    그것은 인수 있어야 할 것을 나의 이해이다 각 노드

  4. 데이터 유형은
  5. 루트를 (MPI_MINLOC뿐만 아니라 한정된 것으로 보인다)
  6. 상기 (MPI_FLOAT_INT은 상기 링크에 기초하여 정의 될 나타남) 지정된 통신 그룹의 노드 ID
  7. 대기 할 통신 그룹입니다.

    [compute-2-19.local:9754] *** An error occurred in MPI_Reduce 
    [compute-2-19.local:9754] *** on communicator MPI_COMM_WORLD 
    [compute-2-19.local:9754] *** MPI_ERR_ARG: invalid argument of some other kind 
    [compute-2-19.local:9754] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) 
    -------------------------------------------------------------------------- 
    mpirun has exited due to process rank 0 with PID 9754 on 
    node compute-2-19.local exiting improperly. There are two reasons this could occur: 
    
    1. this process did not call "init" before exiting, but others in 
    the job did. This can cause a job to hang indefinitely while it waits 
    for all processes to call "init". By rule, if one process calls "init", 
    then ALL processes must call "init" prior to termination. 
    
    2. this process called "init", but exited without calling "finalize". 
    By rule, all processes that call "init" MUST call "finalize" prior to 
    exiting or it will be considered an "abnormal termination" 
    
    This may have caused other processes in the application to be 
    terminated by signals sent by mpirun (as reported here). 
    -------------------------------------------------------------------------- 
    

    나는 완전히이 난처한 상황에 빠진되기 인정한다 : 내 코드가 감소 동작을하게되면

나는이 오류가 발생합니다. 필자는 CentOS 5.5 기반의 Rocks 클러스터에서 OpenMPI 1.5.3 (gcc 4.4 사용)을 사용하여 컴파일하고 있습니다.

답변

4

입력 및 출력 (처음 두 개의 인수)에 동일한 버퍼를 사용할 수 없다고 생각합니다. 내가 맨 페이지 (귀하의 질문에 링크)를 읽고 그것은 말합니다 :

"의사 소통이 인트라 커뮤니 케 이터 인 경우, 출력 버퍼가 입력 버퍼로 사용됩니다. 변수 MPI_IN_PLACE를 루트 프로세스 sendbuf의 값으로 사용합니다.이 경우 입력 데이터는 수신 버퍼의 루트에서 가져 오며 출력 데이터로 대체됩니다. "

+0

그게 전부입니다. 나는 잠시 동안 (같은 객체를 보내고 받음으로써) 그런 일을 해왔다. 나는 돌아가서 그것을 합법적으로 지금 허락해야한다. 빠른 답변 감사합니다. – jthecie

+0

좋습니다. (당신은 더 조심스럽게 docu를 읽었어야했는데 openMPI는 더 명확한 에러 메시지를 주어야했다.) – Walter

+0

다른 모든 일대일 작업에서 이것을 할 수 있었고 어리석은 실수를 범할 수 있다는 것을 상기하면서 발에서 나를 쏘았을 때 그것도 여기에서 효과가있을 것입니다. 이제 저는이 코드를 이해하고 작동시킬 수있었습니다. 다시 한번, 빠른 답장을 보내 주셔서 감사합니다. – jthecie

관련 문제