2013-11-28 12 views
0

나는 이것을 보았지만, 객체가 아닌 프리미티브를 다루고 있기 때문에 도움이되지 않았다. 이것은 단지 프로젝트의 추가 섹션의 일부입니다. 그것은 그대로지만, 제대로 작동시키고 싶습니다.MPJ Express 송수신 - ClassCastException

괜찮습니다.하지만 실행하면 20 행에서 ClassCastException이 발생합니다.

/* Java Version (mine) */  
public class PingPongJava { 

    public static void main(String args[]) throws Exception { 
     int me; 
     int size; 
     int recv_buf = 0; 
     int buf = 0; 
     int send_buf = 101; 
     double tic = 0, toc = 0; 

     MPI.Init(args); 
     me = MPI.COMM_WORLD.Rank(); 
     size = MPI.COMM_WORLD.Size(); 

     tic = MPI.Wtime(); 
     for (int i = 0; i < 50; i++){ 
      if (me == 0){ 
      MPI.COMM_WORLD.Send(send_buf, 0,1,MPI.INT, 17, 100); 
      MPI.COMM_WORLD.Recv(recv_buf, 0,1, MPI.INT, 23, 100); 

      } 
      else{ 
      MPI.COMM_WORLD.Recv(buf, 0, 1, MPI.INT, 17, 100); 
      MPI.COMM_WORLD.Send(buf, 0,1,MPI.INT, 23, 100); 
      } 
     } 
     toc = MPI.Wtime(); 
     if (me == 0){ 
      System.out.println("Time taken is " + (toc-tic)/100); 
      } 

     MPI.Finalize(); 
    } 
    } 

내가

/* Point-to-point communication. 
*/ 
#include <mpi.h> 
#include <stdio.h> 

int main(int argc, char **argv){ 
    int rank, size, i, recv_buf, send_buf=101, buf; 
    MPI_Status status; 
    double tic, toc; 

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

    tic = MPI_Wtime(); 
    for(i=0;i<50;i++){ 
    if(rank==0){ 
     MPI_Send(&send_buf, 1, MPI_INT, 1, 17 , MPI_COMM_WORLD); 
     MPI_Recv(&recv_buf, 1, MPI_INT, 1, 23, MPI_COMM_WORLD, &status); 
    }else{ 
     MPI_Recv(&buf, 1, MPI_INT, 0, 17, MPI_COMM_WORLD, &status); 
     MPI_Send(&buf, 1, MPI_INT, 0, 23, MPI_COMM_WORLD); 
    } 
    } 
    toc = MPI_Wtime(); 

    if(rank==0) 
    printf("Average time for a single message: %lf seconds \n", (toc-tic)/100.0); 

    MPI_Finalize(); 
    return 0; 
} 

답변

1

첫째,이 C 버전으로 변환하고있어, 당신은 변수 recv_buf에 대한 배열 형, 버피, send_buf를 사용해야합니다. 2 차적으로, 당신의 두 가지 마지막 인수는 Send, Recv 서명이 잘못되었습니다. 그들은 Receive에서 ".. destination, tag)"이어야하고 "..source, tag"에 있어야합니다. 나는 당신의 실수를 아래의 코드에서 바로 잡았다.

public class PingPongJava { 

    public static void main(String args[]) throws Exception { 
     int me; 
     int size; 
     int[] recv_buf = { 0 }; 
     int[] buf = {0}; 
     int[] send_buf = { 101 }; 
     double tic = 0, toc = 0; 

     MPI.Init(args); 

     me = MPI.COMM_WORLD.Rank(); 
     size = MPI.COMM_WORLD.Size(); 

     tic = MPI.Wtime(); 

     for (int i = 0; i < 50; i++) { 
      if (me == 0) { 
       MPI.COMM_WORLD.Send(send_buf, 0, 1, MPI.INT, 1, 17); 
       MPI.COMM_WORLD.Recv(recv_buf, 0, 1, MPI.INT, 1, 23); 
      } else { 
       MPI.COMM_WORLD.Recv(buf, 0, 1, MPI.INT, 0, 17); 
       MPI.COMM_WORLD.Send(buf, 0, 1, MPI.INT, 0, 23); 
      } 
     } 
     toc = MPI.Wtime(); 

     if (me == 0) { 
      System.out.println("Time taken is " + (toc - tic)/100); 
     } 

     MPI.Finalize(); 
    } 
}