2016-04-10 5 views
1

配列をとり、その部分を別のプロセッサに送り、それらのプロセッサがコンポーネントの計算を行い、次にその部分を送信する単純な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);

を使用するときにプログラムがフリーズするということでしょうか?私はプロセッサ上の配列に計算を分散したいと思っています。これはまずは​​良い例になると思いました。

+0

まず、MPI C++セットは推奨されていないため、Cバインディングを使用することをお勧めします。第2に、すべてのデータが常にマスターに戻る必要があるかどうか、すなわち、マスターが完全な配列を含むかどうか。 – Chiel

+0

ランク= 2のプロセッサはアレイの半分を送信してはいけませんか? –

+0

残念ながら、私は使用している他の既存のコードとの互換性のためにC++を使用する必要があります。 – Drew

答えて

0

MPIを使用する場合、そのような種類のタスク用に設計された関数があります。 MPI_ScatterおよびMPI_Reduce。それは、あなたの計算を行い、その結果をコーディネーターに返すように、あなたの配列をn人の子供に分けることを可能にします。

関連する問題