3

MPI を使用してプレフィックス サムを実装するのに苦労しています。いくつかの行が欠けていると思いますが、どの行が欠けているのか、どこに配置すればよいのかわかりません。ここに私が持っているものがあります:

int main(int argc, char** argv){  
 int i, size, nprocs, rank;
 int array[atoi(argv[1])];

int Destination, Destination_tag;
int Source, Source_tag, RecvData;

int len = sizeof(array)/sizeof(int);

for(i = 0; i < size; i++) 
     {
    array[i] = i+rank*size;
}

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

int id = rank;

      //I believe the error is here
for(i = 0; i < size, i++)
{
    message = (rank - pow(2,x));

    Destination = message ;
    Destination_tag = array.id; 
    MPI_Send(&message, 1, MPI_INT, Destination, Destination_tag, MPI_COMM_WORLD); 

    Source = message ;
    Source_tag = message; 
    MPI_Recv(&RecvData, 1, MPI_INT, Source, Source_tag, MPI_COMM_WORLD, &Status); 
   //End of problem area
    printf("My rank is  %d n =%d \n",i,size); 

    MPI_Finalize();
    return 0;

}

4

2 に答える 2

9

MPI_Sendとを使用してプレフィックスの合計を手動で計算する代わりにMPI_Recv、 を使用しますMPI_ScanMPI_Scanprocess_{0} から process_{your rank} への要素の部分的な包括的削減を実行し、接頭辞の合計を非常に簡単に (そして効果的に!) 実行できるようにします。

たとえば、単一の整数が次のようにプロセス全体に分散しているとします。
プロセス 0 = 2
プロセス 1 = 3
プロセス 2 = 4
プロセス 3 = 5

リダクション操作としてMPI_Scanusingを呼び出すと、結果は次のようになります: プロセス 0 = 2 プロセス 1 = 5 プロセス 2 = 9 プロセス 3 = 14MPI_SUM




呼び出しMPI_Exscanて排他的スキャンを実行します。つまり、リダクションには呼び出しプロセスが保持するデータは含まれません。結果は次のようになります:
プロセス 0 = 未定義 (recv_buffer を 0 に設定しないと、ガベージがそこに存在します)
プロセス 1 = 2
プロセス 2 = 5
プロセス 3 = 9

于 2012-11-27T21:04:18.280 に答える
0

MPIの送受信コールがエラーである可能性があります。一般的に、私は、MPIプロセスに、

 if (rank == 0)
    {
      MPI_Send(...
    }

if (rank == 1)
    {
     MPI_Recieve(...
于 2012-11-24T16:01:26.137 に答える