2017-10-04 9 views
0

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를 인쇄 할 경우

, 그것은 것입니다. 다른 결과는 옳다.

누구든지 내 코드에 어떤 문제가 있는지 확인할 수 있습니까?

감사합니다.

답변

2

여기 그래서 당신은 모든 작업의 ​​데이터 대기 j 반복에서 마스터

for(j=0;j<num_Proc;j++){ 
    MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE); 
    sum_local += sum_partial[j]; //Sum all results 
} 

에 루프,하지만 당신은 암시 적으로 작업 j의 데이터가 수신 된 가정 (예를 들어, 당신은 sum_partial[j] 액세스).

할 수 있습니다 중 하나

for(j=0;j<num_Proc;j++){ 
    MPI_Wait(&req[j], MPI_STATUS_IGNORE); 
    sum_local += sum_partial[j]; //Sum all results 
} 

또는

for(j=0;j<num_Proc;j++){ 
    MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE); 
    sum_local += sum_partial[source]; //Sum all results 
} 

그냥 명확하게하기 위해, 당신이 4 개 작업을 "작업"을했다 생각했지만, 그냥 운이 더 높습니다.

+0

그게 전부입니다. 나는 그것이 아주 명백했다는 것을 믿을 수 없다. 고맙습니다. –

+0

여러분 모두 환영합니다. –