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ıyorummpirun -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.
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
Sıra = 2 olan işlemci dizinin yarısını göndermemeli mi? –
Maalesef kullandığım diğer mevcut kodlarla uyumluluk nedeniyle C++ kullanmak zorundayım. – Drew