0

私はMPIで始めています。私がやっている宿題のために、ジョブを別のプロセスに割り当てることによって指定した入力の合計を生成する必要があります。整数の結果が得られると、私のプログラムは正常に動作します。例: 20/20 = 1 または 20/10 = 2。ただし、小数点が 20/9 =2.222 になると、問題が発生し、間違った結果が得られます。これを回避する方法がよくわかりません。これが、散乱して合計を生成するための私のコードです。

readNumber = 読み込まれた値 (例: 20) storage = 値を持つ配列 (1,2,3,4....20)

/*Scatter*/ 
    MPI_Scatter(storage, readNumber/size, MPI_INT, 

                         recStorage, readNumber/size, MPI_INT, 0, MPI_COMM_WORLD);

    total=0;
    printf("%d \n",readNumber/size);
    for(i=0;i<readNumber/size;i++){
        total=total+recStorage[i];
    }
    printf("rank= %d total= %d \n ",rank,total);


    /*Reduce*/

    MPI_Reduce( &total, &gtotal, send_count, MPI_INT, MPI_SUM, 0,   MPI_COMM_WORLD);


    if(rank == 0){
      printf("total = %d \n ",gtotal);
    }
4

2 に答える 2

2

浮動小数点の結果を取得したい場合は、スキャッターとリデュースの両方で型引数に MPI_FLOAT を使用する必要があります。

編集: また、浮動小数点の結果を取得したい場合は、printf で %d を使用しないでください。

2番目の編集:答えを明確にした後。送信要素にも受信要素にも整数以外の要素を使用することはできません。ここを見てください。

THIRD_EDIT: 各プロセッサへの等しくない数の要素の送信を処理できます。MPI_Scattervを見てください。

于 2012-04-10T07:49:39.707 に答える
0

あなたの問題は、プロセスの数が作業量の約数ではない場合でも、各プロセスに同じサイズの作業を送信しようとしていることだと思います。つまり、2000 要素の配列の要素を合計したい場合、4 つのプロセッサのそれぞれが 500 の要素を取得し、9 つのプロセッサのそれぞれが取得することになります...エラーハングオン...整数除算です2000/9 = 2229*222==1998、そうしない場合配列の 2 つの要素が合計に追加されないように注意してください。これらの要素をプロセスに割り当てるように手配する必要があります。

これはあなたの宿題なので、詳細はあなたに任せます。

于 2012-04-10T08:18:00.270 に答える