지금까지, 내 응용 프로그램은 정수 목록과 함께 txt 파일을 읽고 있습니다. 이러한 정수는 마스터 프로세스, 즉 순위가 0 인 프로세서에 의해 배열에 저장되어야합니다. 정상적으로 작동합니다.C에서 MPI_Scatter 및 MPI_Gather를 어떻게 사용합니까?
이제 프로그램을 실행할 때 master 프로세스인지 여부를 확인하는 if 문이 있으며 그럴 경우 MPI_Scatter
명령을 실행하고 있습니다.
내가 이해하는 바로는이 배열을 숫자로 세분화하여 슬레이브 프로세스, 즉 순위> 0 인 모든 것으로 전달합니다. 그러나 MPI_Scatter
을 어떻게 처리해야할지 모르겠습니다. 어떻게 슬레이브 프로세스가 서브 어레이를 얻기 위해 "가입"합니까? 마스터가 아닌 프로세스에게 서브 어레이로 어떤 일을하도록 어떻게 말할 수 있습니까?
마스터 프로세스가 배열의 요소를 보내는 방법을 보여주는 간단한 예제를 제공 한 다음 슬레이브에 합계를 더하고이를 마스터에 반환하면 합계가 모두 합쳐져서 출력됩니다. 지금까지
내 코드 :
#include <stdio.h>
#include <mpi.h>
//A pointer to the file to read in.
FILE *fr;
int main(int argc, char *argv[]) {
int rank,size,n,number_read;
char line[80];
int numbers[30];
int buffer[30];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
fr = fopen ("int_data.txt","rt"); //We open the file to be read.
if(rank ==0){
printf("my rank = %d\n",rank);
//Reads in the flat file of integers and stores it in the array 'numbers' of type int.
n=0;
while(fgets(line,80,fr) != NULL) {
sscanf(line, "%d", &number_read);
numbers[n] = number_read;
printf("I am processor no. %d --> At element %d we have number: %d\n",rank,n,numbers[n]);
n++;
}
fclose(fr);
MPI_Scatter(&numbers,2,MPI_INT,&buffer,2,MPI_INT,rank,MPI_COMM_WORLD);
}
else {
MPI_Gather (&buffer, 2, MPI_INT, &numbers, 2, MPI_INT, 0, MPI_COMM_WORLD);
printf("%d",buffer[0]);
}
MPI_Finalize();
return 0;
}
어떤 훌륭한 대답
그래서 여기 (수집 포함 업데이트 ) 간단한 예입니다. 그것을 아주 똑 바른 앞으로하고 나는 그것이 어떻게 지금 작동하는지 본다. 나는 그것을 집합 적 운영으로 생각하지 않는 실수를했다. 감사합니다. – DSF
와우! 내 하루를 구 했잖아, 건배. 감사합니다. – irobo
대부분의 MPI 소개보다 더 많은 도움이됩니다. – WakaChewbacca