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를 호출하지만 여전히 비 차단 비슷한 오류.
오류는 'MPI_Recv'가 예상보다 많은 데이터를 수신하고 있음을 나타냅니다 (19 대신 21 개의 문자). 리시버 코드를 실행하는 스레드가 여러 개 있습니까? 그렇다면 다른 스레드를위한 데이터를받는 스레드가 있으므로 다른 'e_count'가있을 가능성이 있습니다. –