2013-04-13 3 views
1

я получаю эту ошибку во время выполнения:MPJ Экспресс ошибка Я никогда не видел

MPJ Express (0.35) is started in the cluster configuration 
Starting process <0> on <Tornado> 
Starting process <1> on <Predator> 
mpi.MPIException: Error in SimplePacker : count <1> is less than length <2> 
     at mpi.SimplePackerChar.unpack(SimplePackerChar.java:105) 
     at mpi.Comm.recv(Comm.java:1305) 
     at mpi.Comm.Recv(Comm.java:1255) 
     at PingPongVariousLengths.main(PingPongVariousLengths.java:29) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces 
sorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at runtime.daemon.Wrapper.execute(Wrapper.java:165) 
     at runtime.daemon.Wrapper.main(Wrapper.java:180) 
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces 
sorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at runtime.daemon.Wrapper.execute(Wrapper.java:165) 
     at runtime.daemon.Wrapper.main(Wrapper.java:180) 
Caused by: mpi.MPIException: mpi.MPIException: mpi.MPIException: Error in Simple 
Packer : count <1> is less than length <2> 
     at mpi.Comm.Recv(Comm.java:1259) 
     at PingPongVariousLengths.main(PingPongVariousLengths.java:29) 
     ... 6 more 
Caused by: mpi.MPIException: mpi.MPIException: Error in SimplePacker : count <1> 
is less than length <2> 
     at mpi.Comm.recv(Comm.java:1317) 
     at mpi.Comm.Recv(Comm.java:1255) 
     ... 7 more 
Caused by: mpi.MPIException: Error in SimplePacker : count <1> is less than leng 
th <2> 
     at mpi.SimplePackerChar.unpack(SimplePackerChar.java:105) 
     at mpi.Comm.recv(Comm.java:1305) 
     ... 8 more 

Я не понимаю, что это значит,

Это код, который вызывает его:

import mpi.* ; 

class PingPongVariousLengths { 

    static public void main(String[] args) { 

     MPI.Init(args); 
     int myrank = MPI.COMM_WORLD.Rank(); 
     int tag = 99; 
     int maxlen = 104857600; //200 megabytes  104857600 characters * 2 bytes per character = 209715200 bytes total, or 200 megabytes 
     int minlen = 1; // 2 bytes 
     char [] sendbuff = new char [maxlen]; 
     char [] recvbuff = new char [maxlen]; 
     long speedKbps; 
     long speedMbps; 
     long durationseconds; 
int MAX_LOOPS = 20; 

for (int len = minlen; len <= maxlen; len *= 2) { 
     if (myrank == 0) { 
       durationseconds = 0; 
       for (int i = 0; i < MAX_LOOPS; i++) { 
         long startTime = System.nanoTime();   
         MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag); 
         MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag); 
         long endTime = System.nanoTime(); 
         long duration = endTime - startTime; 
         durationseconds = durationseconds + (duration* 10-9); 
       } 
       durationseconds = durationseconds/MAX_LOOPS; 
       System.out.println("Average time for the ping to be sent and recived of " + (len*2) + " bytes is " + durationseconds + " seconds"); 
       double transferRateMb = ((len*524288.0)/durationseconds); 
       System.out.println("average transferRate (megabytes) : " + transferRateMb + " megabytes per second"); 
     } else if (myrank == 1) { 
       MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag); 
       MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag); 
     } 
} 

     MPI.Finalize(); 
    } 
} 

Что вызывает ошибку и как ее можно решить?

EDITTTTT

измененная MinLength на 2

import mpi.* ; 

class PingPongVariousLengths { 

    static public void main(String[] args) { 

     MPI.Init(args); 
     int myrank = MPI.COMM_WORLD.Rank(); 
     int tag = 99; 
     int maxlen = 104857600; //200 megabytes  104857600 characters * 2 bytes per character = 209715200 bytes total, or 200 megabytes 
     int minlen = 2; // 2 bytes 
     char [] sendbuff = new char [maxlen]; 
     char [] recvbuff = new char [maxlen]; 
     long speedKbps; 
     long speedMbps; 
     long durationseconds; 
int MAX_LOOPS = 20; 

for (int len = minlen; len <= maxlen; len *= 2) {//len=*2 doubles the ping size each time 
     if (myrank == 0) { 
       durationseconds = 0; 
       for (int i = 0; i < MAX_LOOPS; i++) { 
         long startTime = System.nanoTime();   
         MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag); 
         MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag); 
         long endTime = System.nanoTime(); 
         long duration = endTime - startTime; 
         durationseconds = durationseconds + (duration* 10-9);// Converts nanoseconds to seconds 
       } 
       durationseconds = durationseconds/MAX_LOOPS; 
       //double transferRate = ((len*2.0)/durationseconds) ; //amount of data in bytes transferred in 1 second. Currently returning 0 for every result 
       //System.out.println("transferRate: " + transferRate + " bytes per second"); 
       System.out.println("Average time for the ping to be sent and recived of " + (len*2) + " bytes is " + durationseconds + " seconds"); 
       double transferRateMb = ((len*524288.0)/durationseconds); 
       System.out.println("average transferRate (megabytes) : " + transferRateMb + " megabytes per second"); 
     } else if (myrank == 1) { 
       MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag); 
       MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag); 
     } 
} 

     MPI.Finalize(); 
    } 
} 

и я получаю эту ошибку:

PongVariousLengths 
MPJ Express (0.35) is started in the cluster configuration 
Starting process <0> on <Tornado> 
Starting process <1> on <Predator> 
mpi.MPIException: Error in SimplePacker : count <2> is less than length <4> 
     at mpi.SimplePackerChar.unpack(SimplePackerChar.java:105) 
     at mpi.Comm.recv(Comm.java:1305) 
     at mpi.Comm.Recv(Comm.java:1255) 
     at PingPongVariousLengths.main(PingPongVariousLengths.java:25) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces 
sorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at runtime.daemon.Wrapper.execute(Wrapper.java:165) 
     at runtime.daemon.Wrapper.main(Wrapper.java:180) 
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces 
sorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at runtime.daemon.Wrapper.execute(Wrapper.java:165) 
     at runtime.daemon.Wrapper.main(Wrapper.java:180) 
Caused by: mpi.MPIException: mpi.MPIException: mpi.MPIException: Error in Simple 
Packer : count <2> is less than length <4> 
     at mpi.Comm.Recv(Comm.java:1259) 
     at PingPongVariousLengths.main(PingPongVariousLengths.java:25) 
     ... 6 more 
Caused by: mpi.MPIException: mpi.MPIException: Error in SimplePacker : count <2> 
is less than length <4> 
     at mpi.Comm.recv(Comm.java:1317) 
     at mpi.Comm.Recv(Comm.java:1255) 
     ... 7 more 
Caused by: mpi.MPIException: Error in SimplePacker : count <2> is less than leng 
th <4> 
     at mpi.SimplePackerChar.unpack(SimplePackerChar.java:105) 
     at mpi.Comm.recv(Comm.java:1305) 
     ... 8 more 

EDIT 2

Итак, после небольшого количества проб и ошибок я прокомментировал '// len * = 2)' в строке 19, с этим прокомментировал, что программа будет работать, но она будет работать con строго в 2 байта и не останавливался после 20 требуемых циклов, поэтому я думаю, что это проблема, но как это можно решить?

+0

Что такое линия 29? – Kevin

+0

это просто символ} – user2065929

+0

Не следует начинать с 'minlen = 2'. – Esailija

ответ

0

Ваше исключение, кажется, брошенный этим block of code:

public void unpack(mpjbuf.Buffer mpjbuf, int length, Object buf, 
        int offset, int count) throws MPIException { 

    if(count * numEls < length) { 
     throw new MPIException ("Error in SimplePacker : count <"+ 
      (count*numEls)+"> is less than length <"+length+">"); 
    } 

Получается, что count * numEls меньше length. И все это, кажется, ведет к вашему Recv() вызова (то, что я предполагаю, что линия 29), либо:

MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag); 

или

MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag); 

Так что «счетчик» (len) меньше, чем длина (который равен 2). У вас есть minlen, установленный в 1 (который не является «2», как говорят комментарии), попробуйте установить его на 2 вместо.

+0

Даже после корректировки счета он утверждает, что получил ту же ошибку:> – Esailija

+0

добавил ошибку к исходному вопросу вместе с текущим кодом – user2065929

+0

Ok добавил другое редактирование , думаю, я нашел проблему, но не знаю, как ее решить – user2065929

0

Основная проблема с вашим кодом заключается в том, что вы пропустили внутренний цикл, который работает от i=0 до MAX_LOOP при обработке с помощью rank=1. Поскольку внешний цикл имеет переменную длину, ваш процесс с rank=0 отправляет сообщение len=2, тогда как процесс с rank=1 ожидает сообщения с len=4, потому что он находится в следующей итерации внешнего цикла. Если вы вставляете операторы печати, вы увидите, что ваше первое сообщение успешно завершено. Но для второй итерации это непродолжительное совпадение. Вот код исправления:

for (int len = minlen; len <= maxlen; len *= 2) { 
     if (myrank == 0) { 
       durationseconds = 0; 
       for (int i = 0; i < MAX_LOOPS; i++) { 
         long startTime = System.nanoTime(); 
         System.out.println("Processor 0 printing len="+len); 
         MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag); 
         MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag); 
         long endTime = System.nanoTime(); 
         long duration = endTime - startTime; 
         durationseconds = durationseconds + (duration* 10-9); 
       } 
       durationseconds = durationseconds/MAX_LOOPS; 
       System.out.println("Average time for the ping to be sent and recived of " + (len*2) + " bytes is " + durationseconds + " seconds"); 
       double transferRateMb = ((len*524288.0)/durationseconds); 
       System.out.println("average transferRate (megabytes) : " + transferRateMb + " megabytes per second"); 
     } else if (myrank == 1) { 
       for(int i =0; i < MAX_LOOPS; i++){ 
         System.out.println("Processor 1 printing len="+len); 
         MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag); 
         MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag); 
       } 
     } 
} 
Смежные вопросы