2016-05-16 3 views
1

私は、マスタプロセスからスレーブへの配列に配置されたランダムな値を送る小さなプログラムを書きました。奴隷は少しの数式を数えており、その結果をマスターに返すべきです。今度は、マスターは結果を新しい結果配列に正しい順序で配置する必要があります。私はメッセージタグを使用しています。ここで はメソッドです:メッセージタグを使って正しい順序で値を入れたMPI

スレーブスレーブによってマスタから

void Ccalculation::slaceRecv() 
{ 

    MPI_Status status; 
    MPI_Recv(&slaveTask, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
    //here I am creating variable whith tag which I ll be returning 
    msgTag = status.MPI_TAG; 
    cout << "msg tag: " << status.MPI_TAG << " number " << slaveTask << endl; 
} 

をタスクを受け

void Ccalculation::masterSend(int * tasklist) 
{ 
    for (int i = 1; i < this->world_size; i++) { 
     MPI_Send(&tasklist[current], 1, MPI_INT, i, current, MPI_COMM_WORLD); 
     current++; 
    } 
} 

に自分のタスクリストの一つの要素を送信するここでの問題は、解決策を送信

を開始しますマスターwhith特定タグ

void Ccalculation::slaveSend(double solution) 
{ 
     MPI_Send(&solution, 1, MPI_DOUBLE, 0, msgTag, MPI_COMM_WORLD); 
} 

マスターによって溶液を受信し、それが

void Ccalculation::masterRecv(double *solutionTab) 
{ 
    double buffer = 0; 
    MPI_Status status; 
    for (size_t i = 0; i < this->world_size; i++) 
    { 
     MPI_Recv(&buffer, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
     solutionTab[status.MPI_TAG] = buffer; 
    } 
} 
+1

コードを実行したときの正確な問題は何ですか? 'masterSend'で' current = 0'を初期化していますか? – kraffenetti

答えて

0

MPIが内蔵されている機能を、このような問題を解決するためにsolutionArrayして置きます。彼らは集団操作と呼ばれています。特に、タスクリストの要素を別のプロセスに配布する場合は、MPI_Scatterを使用できます。各プロセスから1つの要素を収集する逆の操作は、MPI_gatherによって実現されます。あなたは、コードは1行だけで、あなたのmasterSendslaceRecv機能の両方を置き換えることができます

MPI_Scatter(tasklist, this->world_size, MPI_INT, &current, 1, MPI_INT, 0, MPI_COMM_WORLD); 

同様に、あなたはMPI_Gatherを使用して、コードは1行だけで、あなたの機能slaveSendmasterRecvを置き換えることができます。

+0

私のプロジェクトでは、MPI_Send関数とMPI_Recv関数のみを使用しなければならず、問題は解決しましたが、あなたにはとても感謝しています:) – LucasPG

関連する問題