mpi로 동적 프로세스 생성을 사용하려고하지만 하위 프로세스의 응답을받는 데 문제가 있습니다. 각 자식의 결과를 저장하기 위해 sum_partial이라는 벡터를 만들었습니다. 4 개의 프로세스 (1 개의 부모 프로세스 + 3 개의 자식)로 실행하면이 기능이 정상적으로 작동합니다. 그러나 더 많은 프로세스를 실행할 때 sum_partial은 일부 자식의 결과를 얻지 못합니다.MPI_Waitany가 일부 프로세스를 기다리고 있지 않습니다.
문제가 MPI_Irecv 또는 MPI_Waitany인지 확실하지 않습니다. MPI_Wait, MPI_Waitall, MPI_Test를 사용하여 다른 접근법을 시도했습니다. 그러나 문제는 반복됩니다.
다음은 상위 프로세스에서 사용하는 코드의 MPI 블록입니다.
//Some code here...
for(j=0;j<num_Proc;j++){
sprintf(argv[2], "%llu", vetIni[j+1]);
sprintf(argv[3], "%llu", vetEnd[j+1]);
MPI_Comm_spawn(bin, argv, 1, localInfo, 0, MPI_COMM_SELF, &intercommChild[j], err);
}
long long int sum_local=0, *sum_partial = calloc(num_Proc, sizeof(long long int));
for(j=0;j<num_Proc;j++)
MPI_Irecv(&sum_partial[j], 1, MPI_LONG, 0, 99, intercommChild[j], &req[j]);
long long int ini = vetIni[0], end = vetEnd[0];
for(i=ini;i<end;i++)
sum_local += i * (N-i); //Parent process do it's computation
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
MPI_Finalize();
다음은 하위 프로세스가 실행되는 코드입니다.
-8393498447644280608
4191132954560973024
0
0
-3708736119148578592
9184626552355719392
-903258050952161056
이이 제로는이 있어야되지 않습니다처럼
//Some code here...
long long int ini = atol(argv[2]);
long long int end = atol(argv[3]);
long long int sum=0, i;
for(i=ini;i<end;i++)
sum += i*(N-i);
MPI_Send(&sum, 1, MPI_LONG, 0, 99, intercommPai);
MPI_Finalize();
내가 일곱 자녀와 함께 실행하는 sum_partial를 인쇄 할 경우
, 그것은 것입니다. 다른 결과는 옳다.누구든지 내 코드에 어떤 문제가 있는지 확인할 수 있습니까?
감사합니다.
그게 전부입니다. 나는 그것이 아주 명백했다는 것을 믿을 수 없다. 고맙습니다. –
여러분 모두 환영합니다. –