0

整数の配列で最小数を見つけようとしていますが、0 が返されます。

import mpi.*;
import java.util.Random;

class AddIntSR
{
public static void main(String[] params) throws Exception
{
    MPI.Init(params);
    int me = MPI.COMM_WORLD.Rank();
    int size = MPI.COMM_WORLD.Size();
    final int CHUNKSIZE = 1;
    final int ROOT = 0;
    Random rg = new Random();

    int [] bigBuf = new int[CHUNKSIZE *size];
    int [] smallBuf = new int[CHUNKSIZE];
    int [] minBuf = new int[1];

    int localTotal = 0;

    if (me == ROOT)
    {
        for(int i = 0; i< bigBuf.length; i++)
            bigBuf[i] = rg.nextInt(10);

        for(int i = 0; i< bigBuf.length; i++)
            System.out.println("bigBuf "+bigBuf[i]);    
    }

    MPI.COMM_WORLD.Scatter(bigBuf,0,CHUNKSIZE,MPI.INT,smallBuf,0,CHUNKSIZE,MPI.INT,ROOT);

    if(me!= ROOT)
    {
        System.out.println("smallBuf "+me+ ": "+smallBuf[0]);
        for(int i = 0; i < smallBuf.length; i++)
            localTotal += smallBuf[i];
    }

    MPI.COMM_WORLD.Reduce(new int[]{localTotal},0,bigBuf,0,1,MPI.INT,MPI.MAX,ROOT);
    MPI.COMM_WORLD.Reduce(new int[]{localTotal},0,minBuf,0,1,MPI.INT,MPI.MIN,ROOT);

    if(me == ROOT)
    {   
        System.out.println(bigBuf[0]);
        System.out.println(minBuf[0]);
    }
}
}

なぜうまくいかないのかわかりません。最大機能は正常に動作しているようです。また、プロセッサ 0 に送信された整数にアクセスして、最小/最大比較に含めるにはどうすればよいでしょうか?

ありがとうございました。

4

1 に答える 1

1

は常にランクであり、これは実際に最小値であるため、削減は常に結果になりますMIN0localTotal0ROOT

MPI.COMM_WORLD.Scatter呼び出し後、を含むすべてのプロセスROOTのにデータが含まれますsmallBuf。したがって、次の条件を削除する必要があります。

if(me!= ROOT)
{
    System.out.println("smallBuf "+me+ ": "+smallBuf[0]);
    for(int i = 0; i < smallBuf.length; i++)
        localTotal += smallBuf[i];
}

単純になる必要があります:

System.out.println("smallBuf "+me+ ": "+smallBuf[0]);
for(int i = 0; i < smallBuf.length; i++)
    localTotal += smallBuf[i];
于 2013-03-15T17:06:33.610 に答える