보내기 메시지를 전달하는 병렬 MPI 프로그램


머리말

실현 목적:
각 짝수 프로세스는 오른쪽의 홀수 프로세스에게 메시지를 보내고 홀수 프로세스는 메시지를 인쇄합니다.예를 들면 총 7개의 프로세스가 있습니다. 1번은 1번에 인쇄되고 2번은 3번에 메시지를 보내고 3번에 인쇄됩니다. 4번은 5번에 메시지를 보내고 5번에 인쇄됩니다. 6번 해당 수신 프로세스가 없기 때문에 메시지를 보내지 않습니다.
그런 다음 학습 경험을 컴파일, 디버그, 실행 및 요약합니다.


1. 실험 원리 및 팁

MPI 프로그램은 먼저 #include <mpi.h>를 포함해야 합니다.
모든 MPI 관련 호출은 두 MPI 함수 MPI_Init() 및 MPI_Finalize() 사이에 배치되어야 합니다. MPI_Comm_size(MPI_COMM_WORLD, &comm_sz) MPI_Comm_rank(MPI_COMM_WORLD, &my_rank) 두 개의 MPI 함수 호출은 병렬 프로그램의 프로세스 수와 현재 프로세스의 일련 번호(랭크)를 얻는 데 사용됩니다. 일반적인 SPMD는 다음과 같이 구성됩니다:
if(my_rank == x)
do something;
else
do other things;

2. 실험적인 소스 코드

아래와 같이 코드 쇼:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mpi.h> 
const int MAX_STRING = 100;
int main(void) {
    
    
   char       greeting[MAX_STRING];      
   int        comm_sz;                  
   int        my_rank;                 
   MPI_Init(NULL, NULL);              
   MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); 
   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);   
   if (my_rank != 0) {
    
    
	  sprintf(greeting, "Greetings from process %d of %d!", my_rank, comm_sz);
        MPI_Send(greeting, strlen(greeting)+1, MPI_CHAR,0, 0, MPI_COMM_WORLD);
   } else {
    
    
       printf("Greetings from process %d of %d!\n", my_rank, comm_sz);
	   for (int q = 1; q < comm_sz; q++){
    
    
      MPI_Recv(greeting, MAX_STRING, MPI_CHAR, q,0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
      printf("%s\n", greeting);
      }
   }   
   MPI_Finalize();
   return 0;
}

음, 이것은 여전히 ​​롤링하기에 좋지 않습니다

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mpi.h> 
const int MAX_STRING = 100;
int main(void) {
    
    
   char       greeting[MAX_STRING];      
   int        comm_sz;                  
   int        my_rank;                  
   MPI_Init(NULL, NULL);               
   MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); 
   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
   int src, dst;
   if(my_rank % 2 != 0)
     src = my_rank - 1;
   else
     dst = my_rank + 1;
   
   if (my_rank % 2 != 0) {
    
    
      MPI_Recv(greeting, MAX_STRING, MPI_CHAR, src, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
      printf("Message printed by process %d: %s\n", my_rank, greeting);
   } else {
    
    
      if(dst != comm_sz) {
    
    
        sprintf(greeting, "Greetings from process %d of %d!", my_rank, comm_sz);
        MPI_Send(greeting, strlen(greeting)+1, MPI_CHAR, dst, 0, MPI_COMM_WORLD);  
      }
   }
   MPI_Finalize(); 
   return 0;
} 

3. 실험결과

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

3. 실험에서 부딪힌 문제와 해결책

1. 컴파일된 프로그램을 이해하지 못하고, 올바르게 설정한 comm_sz 및 my_rank 변수를 사용하지 않아 프로그램 오류가 발생합니다.
해결책: 관련 프로그램을 읽고 사용법을 이해하는 동시에 계속 노력하고 개선하십시오.
2. 각 짝수프로세스 우측에 있는 홀수프로세스에게 메시지를 보내고 홀수프로세스에서 메시지를 출력하는 기능을 구현할 때 더 이상 생각하지 않았습니다. ifelse 문으로 구분되었고, 프로세스가 유휴 상태일 수 있는 현상 등을 고려할 때 그 효과는 잘 실현되지 않습니다.
해결 방법 : 미리 else 문을 추가하여 홀수 처리와 짝수 처리를 분리한 후 판단문을 입력하여 송수신 작업을 수행합니다.

요약하다

병렬 프로그램은 주의해야 할 부분이 많기 때문에 초보자는 수동으로 실행하여 주의가 필요한 부분을 파악하고 의사 코드를 작성한 다음 프로그램을 다시 작성하는 것이 좋습니다.피와 눈물의 교훈 후발주자에게 도움이 되었으면 하는 마음에 이 글을 씁니다.
여기에 이미지 설명 삽입

추천

출처blog.csdn.net/weixin_51759592/article/details/125904780