2016-04-10 29 views
1

kullanarak işlemciler üzerinden dağıtma bileşenleri dağıtımı Bir dizi alan, farklı işlemcilere eşit parçalarını gönderen basit bir C++ programı yazmaya çalışıyorum ve bu işlemciler bileşenlerle ilgili hesaplamalar yapıyor ve daha sonra bölümlerin parçalarını gönderiyorlar. dizi, son dizide birleştirilecek ana işlemciye geri döner.Açık MPI'yi C++

I boyutu 2 bir dizi sahip, basit bir durum ile başladı ve birinci bileşen, bir işlem tarafından işlemi 1. İkinci bileşen 2 ile ilave alır göre 1 tarafından eklenen alır 2. Burada

ne olduğunu Ben:

# include <cstdlib> 
# include <iostream> 
# include <iomanip> 
# include <ctime> 
#include <fstream> 
# include "mpi.h" 

using namespace std; 

ofstream debug("DEBUG"); 
ofstream debug1("DEBUG1"); 
ofstream debug2("DEBUG2"); 

// Declare the array 
double arr[2]; 

int main(int argc, char *argv[]) 
{ 
MPI::Init(argc, argv); 

// Make the array 
arr[0] = 1; 
arr[1] = 2; 

int rank = MPI::COMM_WORLD.Get_rank(); 
int npes = MPI::COMM_WORLD.Get_size(); 

if (rank == 0) { 
    cout << "Running on "<< npes << " Processes "<< endl; 
    double arr1; 
    double arr2; 
    MPI::COMM_WORLD.Recv(&arr1, 1, MPI::DOUBLE, 0, 0); 
    debug << "arr1: " << arr1 << endl; 

    /*... Program freezes here. I'd like to combine arr1 and arr2 into 
arr*/ 
} 

if (rank == 1){ 
    debug1 << "This is process " << rank << endl; 
    double arr1 = arr[0]; 
    debug1 << "arr1: " << arr1 << endl; 
    arr1 = arr1 + 1; 
    debug1 << "arr1+1: " << arr1 << endl; 
    MPI::COMM_WORLD.Send(&arr1, 1, MPI::DOUBLE, 0, 0); 
} 

if (rank == 2){ 
    debug2 << "This is process " << rank << endl; 
    double arr2 = arr[1]; 
    debug2 << "arr2: " << arr2 << endl; 
    arr2 = arr2 + 2; 
    debug2 << "arr2+2: " << arr2 << endl; 
} 

cout << "Greetings from process " << rank << endl; 
MPI::Finalize(); 
} 

Ben

mpiCC test.cpp -o test

ile derleme ve

ile çalıştırıyorum

mpirun -np 3 test

I arr 1 işlemcide çalıştırmak için 2 işlemcileri kullanmak isteyen bu yana (yöntem 0) bileşenleri toplamak.

Sorunum böyle olacağını neden

bilen var mı 0. sürecine ilişkin

MPI::COMM_WORLD.Recv(&arr1, 1, MPI::DOUBLE, 0, 0);

kullanırken programı donuyor bu? Bir dizi üzerinde hesaplamaları işlemciler üzerinden dağıtmayı çok isterdim ve bunun iyi bir örnek olacağını düşündüm.

+0

Her şeyden önce, MPI C++ seti kullanımdan kaldırıldı, bu yüzden C-bağlamalarının kullanılması tavsiye edilir. İkincisi, tüm verilerin her zaman master'a geri dönmesi gerekiyor, yani master tam diziyi içeriyor mu? – Chiel

+0

Sıra = 2 olan işlemci dizinin yarısını göndermemeli mi? –

+0

Maalesef kullandığım diğer mevcut kodlarla uyumluluk nedeniyle C++ kullanmak zorundayım. – Drew

cevap

0

MPI kullandığınızda, bu tür bir görev için tasarlanmış işlevler vardır. MPI_Scatter ve MPI_Reduce. Dizilerinizi n çocuğunuza hesaplamanızı ve sonuçlarınızı koordinatöre aktarmanızı sağlar.