2013-03-15 101 views
0

我試圖找到我的整數數組的最小數目,但是,它返回0。MPI分鐘功能降低

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的整數,因此它包含在最小/最大比較中?

謝謝。

回答

1

MIN還原總是導致0因爲localTotal總是0中排名ROOT這的確是最小值。

在撥打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]; 
+0

非常感謝您!非常感激! – user1861861 2013-03-15 17:39:38