配列をとり、その部分を別のプロセッサに送り、それらのプロセッサがコンポーネントの計算を行い、次にその部分を送信する単純なC++プログラムを作成しようとしています。アレイは最終的なアレイに組み合わされるべきマスタープロセッサーに戻る。Open MPI with C++を使用したプロセッサ上での配列コンポーネントの配布
第二の成分は、プロセスによって2 2によって追加さ1.私はサイズ2の配列を有する単純な場合を開始しており、第一成分は、プロセスによって1によって追加さ
ここで何であります私が持っている:
# 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();
}
私は
mpiCC test.cpp -o test
でコンパイルすると
で実行していますmpirun -np 3 test
Iコンポーネントを収集するarr
と1プロセッサ(プロセス0)上で動作する2個のプロセッサを使用するため。
私の問題は、これが起こる理由
は誰もが知っています0プロセスに
MPI::COMM_WORLD.Recv(&arr1, 1, MPI::DOUBLE, 0, 0);
を使用するときにプログラムがフリーズするということでしょうか?私はプロセッサ上の配列に計算を分散したいと思っています。これはまずは良い例になると思いました。
まず、MPI C++セットは推奨されていないため、Cバインディングを使用することをお勧めします。第2に、すべてのデータが常にマスターに戻る必要があるかどうか、すなわち、マスターが完全な配列を含むかどうか。 – Chiel
ランク= 2のプロセッサはアレイの半分を送信してはいけませんか? –
残念ながら、私は使用している他の既存のコードとの互換性のためにC++を使用する必要があります。 – Drew