2011-12-19 4 views
2

MPI 개발과 관련된 프로젝트에서 문제가 있습니다. MPI를 사용하여 RNA 구문 분석 알고리즘을 구현하는 중입니다. 일부 구문 분석 규칙과 구문 분석 테이블 (다른 상태 및 관련 동작 포함)을 기반으로 입력 문자열 구문 분석을 마스터 노드에서 시작했습니다. 구문 분석 테이블에는 각 상태에 대해 병렬로 수행 할 수있는 여러 작업이 있습니다. 그래서, 나는 다른 프로세스들 사이에서 이러한 행동들을 분산시켜야한다. 이를 위해, 주 스레드가 수신 된 동작을 기반으로 구문 분석하는 동안 다른 노드의 동작을 수신하기 위해 별도의 스레드를 사용하여 노드에 현재 상태 및 구문 분석 정보 (현재 구문 분석 스택)를 보냈습니다.MPI - MPI_Recv의 메시지 잘림

발신자 번호 :

StackFlush(&snd_stack); 
StackPush(&snd_stack, state_index); 
StackPush(&snd_stack, current_ch); 
StackPush(&snd_stack, actions_to_skip); 
elements_in_stack = stack.top + 1; 
for(int a=elements_in_stack-1;a>=0;a--) 
       StackPush(&snd_stack, stack.contents[a]); 
StackPush(&snd_stack, elements_in_stack); 
elements_in_stack = parse_tree.top + 1; 
for(int a=elements_in_stack-1;a>=0;a--) 
       StackPush(&snd_stack, parse_tree.contents[a]); 
StackPush(&snd_stack, elements_in_stack); 
elements_in_stack = snd_stack.top+1; 
MPI_Send(&elements_in_stack, 1, MPI_INT, (myrank + actions_to_skip) % mysize, MSG_ACTION_STACK_COUNT, MPI_COMM_WORLD); 
MPI_Send(&snd_stack.contents[0], elements_in_stack, MPI_CHAR, (myrank + actions_to_skip) % mysize, MSG_ACTION_STACK, MPI_COMM_WORLD); 

수신기 코드 : 코드 보낸 사람의 미리보기 및 수신기는 다음과 같습니다이 프로그램은 적은 통신을 가진 작은 입력하지만 우리가 증가함에 따라 벌금을 실행

MPI_Recv(&e_count, 1, MPI_INT, MPI_ANY_SOURCE, MSG_ACTION_STACK_COUNT, MPI_COMM_WORLD, &status); 
if(e_count == 0){ 
       break; 
} 
while((bt_stack.top + e_count) >= bt_stack.maxSize - 1){usleep(500);} 
pthread_mutex_lock(&mutex_bt_stack); //using mutex for accessing shared data among threads 
MPI_Recv(&bt_stack.contents[bt_stack.top + 1], e_count, MPI_CHAR, status.MPI_SOURCE, MSG_ACTION_STACK, MPI_COMM_WORLD, &status); 
bt_stack.top += e_count; 
pthread_mutex_unlock(&mutex_bt_stack); 

응답으로 응답을 증가시키는 입력 크기는 수신자가 처리하는 동안 많은 요청을 수신하므로 다음 오류로 인해 충돌합니다.

MPI_Recv의 치명적인 오류 : 메시지가 잘 렸습니다. 오류 스택 : MPI_Recv (186) .......................................... : MPI_Recv (buf = 0x5b8d7b1, count = 19, MPI_CHAR, src = 3, tag = 1, MPI_COMM_WORLD, status = 0x0) 실패했습니다. MPIDI_CH3U_Request_unpack_uebuf (625) L 메시지 잘림; 21 바이트 받았지만 버퍼 크기는 모든 집단 중단 랭크 0의 종료 상태 위 인한 작업 73 hpc081_56549 19 순위 0 : 사용하여 신호 9.

에 의해 살해 나는이 시도했다가 MPI를 호출하지만 여전히 비 차단 비슷한 오류.

+3

오류는 'MPI_Recv'가 예상보다 많은 데이터를 수신하고 있음을 나타냅니다 (19 대신 21 개의 문자). 리시버 코드를 실행하는 스레드가 여러 개 있습니까? 그렇다면 다른 스레드를위한 데이터를받는 스레드가 있으므로 다른 'e_count'가있을 가능성이 있습니다. –

답변

0

나머지 코드는 어떻게 생겼는지 모르겠지만 여기에 아이디어가 있습니다. break이 있기 때문에 수신기 코드가 루프 또는 switch 문의 일부라고 가정합니다. 송신자 요소 카운트 보낼

  1. 및 길이 제로 메시지합니다 (MPI_Send(&snd_stack.contents... 라인) 그런 경우에는 전송 및 소자 개수가 0이되면 수신 사이에 불일치가 존재한다.
  2. 수신기가 루프 밖으로 나옵니다.이 두 번째 메시지에는 일치하는 수신이 없습니다.
  3. 길이가 0 인 메시지는 다른 것과 일치 할 수 있습니다. 줄을 내려다 보는 오류가 발생할 수 있습니다.