MPI C

2016-04-11 15 views
2

içinde dizi gönderme ve alma İşte kodumun nasıl çalışması gerektiği. Köle düğümleri bazı hesaplamaları gerçekleştirir ve her düğüm, ilgili bir doğrusal dizi olan phi ile bir değer gönderir. Kök düğüm daha sonra 2 değer alır. Kök düğümde N-1 (slave sayısı) phi'u nasıl depolayacağımı anlamaya çalışıyorum. Bir 2D dizide phi kabul çalıştı ama işe yaramadı. Ya da belki yanlış yapıyorum. Dolayısıyla bu kod, gönderilmek üzere son düğümdeki phi değerlerini basitçe alır. Her şeydenMPI C

if (world_rank == root) { 
    for(i=1; i<world_size; i++) { 
     MPI_Irecv(&local_minE[i], 1, MPI_FLOAT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &rcv_request[i]); 
     MPI_Irecv(phi, len, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &rcv_request[i]); 
     MPI_Waitall(world_size-1, &rcv_request[1], &status[1]); 
    } 
    MPI_Waitall(world_size-1, &rcv_request[1], &status[1]); 
} 
else { 
    //after computations, node will send a value, minE with a corresponding array phi 
    MPI_Isend(&minE, 1, MPI_FLOAT, 0, 1, MPI_COMM_WORLD,&send_request[0]); 
    MPI_Isend(phi, len, MPI_INT, root, 1, MPI_COMM_WORLD, &send_request[0]); 
    MPI_Wait(&send_request[0], &status[0]); 
} 
+0

Gerçekte çalışan bir örnek oluşturabilir misiniz? – Chiel

+0

benim sorunumu açıkladı :) – Rowel

cevap

3

Öncelikle, engellenmeyen yönü sizin için önemliyse MPI_Gather() hatta MPI_Igather() kullanmayı düşünmelisiniz.

Şimdi, kod snippet'iniz için temel bir sorun var: Henüz alınmamışken alıcı kısımda phi kullanmayı deneyin. Kodu değiştirmeniz gerekir, böylece ilk önce siz bekletme bölümünü yaparsınız ve sadece kopyalama/aktarım bölümünü yaptıktan sonra.

int *trphi = malloc(len*world_size*sizeof(int)); 
for(i=0; i<world_size; i++) { 
    MPI_Irecv(trphi[i], len, MPI_INT, i, 1, MPI_COMM_WORLD, &rcv_request[i]); 
} 
MPI_Waitall(world_size-1, &rcv_request[1], &status[1]); 
for(i=1; i<world_size; i++) { 
    for(j=0; j<len; j++) { 
     rphi[j][i] = trphi[i][j]; 
    } 
} 
for(j=0; j<len; j++) { 
    rphi[j][O] = phi[j]; 
} 
free(trphi); 

Ama yine, çok daha güzel yapmak (muhtemelen de ve iyi bir MPI_Datatype) MPI_Gather() bakmak:

Bu şuna benzer olacaktır.